Cod sursa(job #3292388)

Utilizator paulihno15Ciumandru Paul paulihno15 Data 8 aprilie 2025 10:51:27
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <bits/stdc++.h>
#define NMAX 500
#define MMAX 12
#define ll long long
#define ull unsigned long long

using namespace std;

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

int n, m, l1, c1, l2, c2, k;
int rmq[MMAX][NMAX + 2][NMAX + 2], expo[NMAX + 2];

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

    for (int p = 1, lat = 2; lat <= n; p++, lat *= 2) {
        for (int l1 = 1; l1 <= n - lat + 1; l1++) {
            for (int c1 = 1; c1 <= n - lat + 1; c1++) {
                int l2 = l1 + (lat >> 1);
                int c2 = c1 + (lat >> 1);
                int max1 = max(rmq[p - 1][l1][c1], rmq[p - 1][l1][c2]);
                int max2 = max(rmq[p - 1][l2][c1], rmq[p - 1][l2][c2]);
                rmq[p][l1][c1] = max(max1, max2);
            }
        }
    }
    for (int i = 2; i <= n; i++) {
        expo[i] = expo[i / 2] + 1;
    }

    while (m--) {
        fin >> l1 >> c1 >> k;
        int e = expo[k];
        int lg = (1 << e);
        l2 = l1 + k - lg;
        c2 = c1 + k - lg;
        int max1 = max(rmq[e][l1][c1], rmq[e][l1][c2]);
        int max2 = max(rmq[e][l2][c1], rmq[e][l2][c2]);
        fout << max(max1, max2) << '\n';
    }
    return 0;
}