Cod sursa(job #3178065)

Utilizator Traian_7109Traian Mihai Danciu Traian_7109 Data 30 noiembrie 2023 22:05:46
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

const int nmax = 500, lgmax = 9;
int a[5 + nmax][5 + nmax], lg2[5 + nmax], rmq[5 + lgmax][5 + nmax][5 + nmax];

void precalcLog(int n) {
    for (int i = 2; i <= n; i++) 
        lg2[i] = 1 + lg2[i >> 1];
}
void buildRmq(int n) {
    precalcLog(n);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            rmq[0][i][j] = a[i][j];
    for (int k = 1; (1 << k) <= n; k++)
        for (int i = 1; i + (1 << k) - 1 <= n; i++)
            for (int j = 1; j + (1 << k) - 1 <= n; j++)
                rmq[k][i][j] = max({rmq[k - 1][i][j], rmq[k - 1][i + (1 << (k - 1))][j],
                                    rmq[k - 1][i][j + (1 << (k - 1))], rmq[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))]});
}
int queryRmq(int x, int y, int l) {
    int lg = lg2[l];
    return max({rmq[lg][x][y], rmq[lg][x + l - (1 << lg)][y], rmq[lg][x][y + l - (1 << lg)], rmq[lg][x + l - (1 << lg)][y + l - (1 << lg)]});
}

signed main() {
    ifstream fin("plantatie.in");
    ofstream fout("plantatie.out");
    int n, q;
    fin >> n >> q;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            fin >> a[i][j];
    buildRmq(n);
    while (q--) {
        int i, j, l;
        fin >> i >> j >> l;
        fout << queryRmq(i, j, l) << '\n';
    }
    return 0;
}