Cod sursa(job #2886810)

Utilizator CristeaCristianCristea Cristian CristeaCristian Data 8 aprilie 2022 13:18:56
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>
#include <algorithm>
#include <cmath>

using namespace std;
ifstream cin("plantatie.in");
ofstream cout("plantatie.out");
const int NMAX = 505, LGMAX = 11;
int rmq[LGMAX][NMAX][NMAX], v[NMAX][NMAX], lg2[NMAX], n;
void build_rmq()
{
    int i, j, lg;
    for(i = 2; i <= n; i++)
        lg2[i] = lg2[i/2] + 1;
    for(i = 1; i <= n; i++)
        for(j = 1; j <= n; j++)
            rmq[0][i][j] = v[i][j];
    for(lg = 1; lg < LGMAX; lg++)
        for(i = 1; i + (1 << lg) - 1 <= n; i++)
            for(j = 1; j + (1 << lg) - 1 <= n; j++)
                rmq[lg][i][j] = max({rmq[lg-1][i][j], rmq[lg-1][i + (1 << (lg-1))][j], rmq[lg-1][i][j + (1 << (lg-1))], rmq[lg-1][i + (1 << (lg-1))][j + (1 << (lg-1))]});
}
int query(int i, int j, int lat)
{
    int lg = lg2[lat], x = i + lat - 1, y = j + lat - 1;
    return max({rmq[lg][i][j], rmq[lg][x-(1<<lg)+1][j], rmq[lg][i][y-(1<<lg)+1], rmq[lg][x-(1<<lg)+1][y-(1<<lg)+1]});
}
int main()
{
    int q, i, j, lat;
    cin >> n >> q;
    for(i = 1; i <= n; i++)
        for(j = 1; j <= n; j++)
            cin >> v[i][j];
    build_rmq();
    while(q--)
    {
        cin >> i >> j >> lat;
        cout << query(i, j, lat) << '\n';
    }
    return 0;
}