Cod sursa(job #2788813)

Utilizator rares89_Dumitriu Rares rares89_ Data 26 octombrie 2021 14:52:33
Problema Plantatie Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 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 len = y - x + 1;
    int k = 31 - __builtin_clz(len); // log2(len)
    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";
    }
    fin.close();
    fout.close();
    return 0;
}