Cod sursa(job #3356588)

Utilizator serbanbBrindescu Serban serbanb Data 2 iunie 2026 17:56:05
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <fstream>

using namespace std;

ifstream fin("plantatie.in");
ofstream fout("plantatie.out");

const int NMAX = 505;
int n,m;
int A[NMAX][NMAX];
int log2[NMAX];
int pow2[18];
int rmq[18][NMAX][NMAX];

void read()
{
    fin >> n >> m;
    for(int i = 0; i < n; ++i){
        for(int j = 0; j < n; ++j){
            fin >> A[i][j];
        }
    }
}

void buildPow2()
{
    pow2[0] = 1;
    for(int i = 1; i < 18; ++i){
        pow2[i] = pow2[i - 1] * 2;
    }
}

void buildLogs()
{
    log2[1] = 0;
    for(int i = 2; i < NMAX; ++i){
        log2[i] = log2[i / 2] + 1;
    }
}

void buildRMQ()
{
    for(int i = 0; i < n; ++i){
        for(int j = 0; j < n; ++j){
            rmq[0][i][j] = A[i][j];
        }
    }
    for(int k = 1; k < 18; ++k){
        for(int i = 0; i < n; ++i){
            for(int j = 0; j < n; ++j){
                if(i < n - pow2[k - 1] && j < n - pow2[k - 1]){
                    rmq[k][i][j] = max(max(rmq[k - 1][i][j], rmq[k - 1][i + pow2[k - 1]][j]), max(rmq[k - 1][i][j + pow2[k - 1]], rmq[k - 1][i + pow2[k - 1]][j + pow2[k - 1]]));
                }
                else if(i < n - pow2[k - 1]){
                    rmq[k][i][j] = max(rmq[k - 1][i][j], rmq[k - 1][i + pow2[k - 1]][j]);
                }
                else if(j < n - pow2[k - 1]){
                    rmq[k][i][j] = max(rmq[k - 1][i][j], rmq[k - 1][i][j + pow2[k - 1]]);
                }
                else{
                    rmq[k][i][j] = rmq[k - 1][i][j];
                }
            }
        }
    }
}

void precalculate()
{
    buildPow2();
    buildLogs();
    buildRMQ();
}

void solve()
{
    for(int i = 0; i < m; ++i){
        int x1,y1,l;
        fin >> x1 >> y1 >> l;
        --x1;
        --y1;
        int x2 = x1 + l - 1;
        int y2 = y1 + l - 1;
        int k = log2[l];
        fout << max(max(rmq[k][x1][y1], rmq[k][x2 - pow2[k] + 1][y1]), max(rmq[k][x1][y2 - pow2[k] + 1], rmq[k][x2 - pow2[k] + 1][y2 - pow2[k] + 1])) << '\n';
    }
}

int main()
{
    read();
    precalculate();
    solve();
    return 0;
}