Cod sursa(job #3226504)

Utilizator Radu_BicliBiclineru Radu Radu_Bicli Data 21 aprilie 2024 16:47:49
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int n, q, p, i, j, r[12][502][502];
int lg[502], x, y, l;

static inline int Query(int x, int y, int l) {
    int k = lg[l];
    int xx = x + l - (1 << k);
    int yy = y + l - (1 << k);
    return max(max(r[k][x ][y], r[k][x ][yy]),
               max(r[k][xx][y], r[k][xx][yy]));
}

int main() {
    fin >> n >> q;
    for(i = 1; i <= n; i++) {
        for(j = 1; j <= n; j++) fin >> r[0][i][j];
    }

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

    for(p = 1; p <= lg[n]; p++) {
        for(i = 1; i <= n - (1 << p) + 1; i++) {
            for(j = 1; j <= n - (1 << p) + 1; j++) {
                int ii = i + (1 << (p - 1));
                int jj = j + (1 << (p - 1));

                r[p][i][j] =                 r[p - 1][i ][j ];
                r[p][i][j] = max(r[p][i][j], r[p - 1][i ][jj]);
                r[p][i][j] = max(r[p][i][j], r[p - 1][ii][j ]);
                r[p][i][j] = max(r[p][i][j], r[p - 1][ii][jj]);
            }
        }
    }

    while(q--) {
        fin >> x >> y >> l;
        fout << Query(x, y, l) << "\n";
    }

    return 0;
}