Cod sursa(job #2788856)

Utilizator rares89_Dumitriu Rares rares89_ Data 26 octombrie 2021 16:15:34
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
 
using namespace std;
 
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
 
int n, m, maxim[503][503][17];
 
int rmq(int x, int y, int l) {
    int k = 31 - __builtin_clz(l); // log2(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]);
    return maxRmq;
}
 
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]);
            }
        }
    }
    // query-uri
    for(int i = 1; i <= m; i++) {
        int x, y, l;
        fin >> x >> y >> l;
        fout << rmq(x, y, l) << "\n";
    }
    return 0;
}