Cod sursa(job #2788853)

Utilizator rares89_Dumitriu Rares rares89_ Data 26 octombrie 2021 16:10:06
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>

using namespace std;

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

int n, m, maxim[503][503][11], lg[503];

int main() {
    fin >> n >> m;
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) {
            fin >> maxim[i][j][0];
        }
    }
    // preprocesare
    for(int k = 1; (1 << k) <= n; k++) {
        for(int i = 1; i + (1 << k) - 1 <= n; i++) {
            for(int j = 1; j + (1 << k) - 1 <= n; j++) {
                /*
                    m[i][j][k] = max(m[i][j][k - 1], m[i][j + 2 ^k-1][k - 1], m[i + 2^k-1][j][k - 1],
                                     m[i + 2^k-1][j + 2 ^k-1][k - 1]);
                */
                maxim[i][j][k] = max(maxim[i][j][k - 1], maxim[i][j + (1 << (k - 1))][k - 1]);
                maxim[i][j][k] = max(maxim[i][j][k], maxim[i + (1 << (k - 1))][j][k - 1]);
                maxim[i][j][k] = max(maxim[i][j][k], maxim[i + (1 << (k - 1))][j + (1 << (k - 1))][k - 1]);
            }
        }
    }
    for(int i = 2; i <= n; i++) {
        lg[i] = lg[i / 2] + 1;
    }
    // query-uri
    for(int i = 1; i <= m; i++) {
        int x, y, l;
        fin >> x >> y >> l;
        int k = lg[l];
        int p = 1 << k;
        /*
            maxRmq = max(m[x][y][k], m[x + l - p][y][k], m[x][y + l - p][k],
                         m[x + l - p][y + l - p][k]);
        */
        int maxRmq = max(maxim[x][y][k], maxim[x + l - p][y][k]);
        maxRmq = max(maxRmq, maxim[x][y + l - p][k]);
        maxRmq = max(maxRmq, maxim[x + l - p][y + l - p][k]);
        fout << maxRmq << "\n";
    }
    return 0;
}