Cod sursa(job #2766992)

Utilizator niculaandreiNicula Andrei Bogdan niculaandrei Data 4 august 2021 13:34:37
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <bits/stdc++.h>
#define LOG_MAX 10
#define N_MAX 505

using namespace std;

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

int N, Q;
int x, y, l;
int Log[N_MAX];
int RMQ[LOG_MAX][N_MAX][N_MAX];

int Query(int x, int y, int l)
{
    int ret = RMQ[Log[l]][x][y];
    ret = max(ret, RMQ[Log[l]][x + l - (1 << Log[l])][y]);
    ret = max(ret, RMQ[Log[l]][x][y + l - (1 << Log[l])]);
    ret = max(ret, RMQ[Log[l]][x + l - (1 << Log[l])][y + l - (1 << Log[l])]);
    return ret;
}

int main()
{
    fin >> N >> Q;
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            fin >> RMQ[0][i][j];
        }
    }

    for (int i = 2; i <= N; i++) {
        Log[i] = Log[i / 2] + 1;
    }

    for (int l = 1; l <= Log[N]; l++) {
        for (int i = 1; i <= N - (1 << l) + 1; i++) {
            for (int j = 1; j <= N - (1 << l) + 1; j++) {
                RMQ[l][i][j] = RMQ[l - 1][i][j];
                RMQ[l][i][j] = max(RMQ[l][i][j], RMQ[l - 1][i][j + (1 << (l - 1))]);
                RMQ[l][i][j] = max(RMQ[l][i][j], RMQ[l - 1][i + (1 << (l - 1))][j]);
                RMQ[l][i][j] = max(RMQ[l][i][j], RMQ[l - 1][i + (1 << (l - 1))][j + (1 << (l - 1))]);
            }
        }
    }

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