Cod sursa(job #3161531)

Utilizator victor_gabrielVictor Tene victor_gabriel Data 27 octombrie 2023 13:39:16
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>

using namespace std;

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

const int DIM = 510;
const int LOG_DIM = 10;

int n, m, x, y, k;
int rmq[LOG_DIM][DIM][DIM], e[DIM];

int getMax(int a, int b, int c, int d) {
    return max(max(a, b), max(c, d));
}

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; (1 << p) <= n; p++) {
        for (int i1 = 1; i1 <= n - (1 << p) + 1; i1++) {
            for (int j1 = 1; j1 <= n - (1 << p) + 1; j1++) {
                int i2 = i1 + (1 << (p - 1));
                int j2 = j1 + (1 << (p - 1));
                rmq[p][i1][j1] = getMax(rmq[p - 1][i1][j1],
                                        rmq[p - 1][i1][j2],
                                        rmq[p - 1][i2][j1],
                                        rmq[p - 1][i2][j2]);
            }
        }
    }

    e[1] = 0;
    for (int i = 2; i <= n; i++)
        e[i] = 1 + e[i / 2];

    for (int i = 1; i <= m; i++) {
        fin >> x >> y >> k;
        int exp = e[k], pow = (1 << exp);
        int sol = getMax(rmq[exp][x][y],
                         rmq[exp][x][y + k - pow],
                         rmq[exp][x + k - pow][y],
                         rmq[exp][x + k - pow][y + k - pow]);
        fout << sol << '\n';
    }

    return 0;
}