Cod sursa(job #3274619)

Utilizator Mihai_OctMihai Octavian Mihai_Oct Data 7 februarie 2025 16:48:45
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int n, q, p, i, j, rmq[502][502][20];
int lg[502], lat;

int main() {
    //ios_base::sync_with_stdio(false);
    fin.tie(nullptr);
    fout.tie(nullptr);

    fin >> n >> q;

    lg[1] = 0;
    for(i = 2; i <= n; i++) lg[i] = 1 + lg[i >> 1];

    for(i = 1; i <= n; i++) {
        for(j = 1; j <= n; j++) fin >> rmq[i][j][0];
    }

    for(p = 1; p <= lg[n]; p++) {
        int lung = (1 << (p - 1));
        for(i = 1; i <= n - (1 << p) + 1; i++) {
            for(j = 1; j <= n - (1 << p) + 1; j++) {
                rmq[i][j][p] = max({rmq[i       ][j       ][p - 1],
                                    rmq[i       ][j + lung][p - 1],
                                    rmq[i + lung][j       ][p - 1],
                                    rmq[i + lung][j + lung][p - 1]});
            }
        }
    }

    while(q--) {
        fin >> i >> j >> lat;

        int in = i + lat - 1;
        int jn = j + lat - 1;

        int k = lg[lat];
        int lung = (1 << k) - 1;

        int ma1 = max(rmq[i        ][j][k], rmq[i        ][jn - lung][k]);
        int ma2 = max(rmq[in - lung][j][k], rmq[in - lung][jn - lung][k]);
        fout << max(ma1, ma2) << "\n";
    }

    return 0;
}