Cod sursa(job #3321852)

Utilizator mihai.25Calin Mihai mihai.25 Data 11 noiembrie 2025 14:36:00
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>

#include <vector>

#include <algorithm>

using namespace std;

ifstream fin ("plantatie.in");

ofstream fout ("plantatie.out");

int main() {

    int n, m;

    fin >> n >> m;

    vector<int> put2 (n + 1);

    put2[1] = 0;

    for (int i = 2; i <= n; ++i) {

        if ((1 << put2[i - 1]) * 2 <= i)
            put2[i] = put2[i - 1] + 1;
        else
            put2[i] = put2[i - 1];
    }

    vector<vector<vector<int>>> rmq (n + 1, vector<vector<int>>(n + 1, vector<int>(put2[n] + 1)));

    for (int i = 1; i <= n; ++i) {

        for (int j = 1; j <= n; ++j) {

            int x;

            fin >> x;

            rmq[i][j][0] = x;
        }
    }

    for (int k = 1; k <= put2[n]; ++k) {

        int l = (1 << (k - 1));

        for (int i = 1; i <= n - (1 << k) + 1; ++i)
            for (int j = 1; j <= n - (1 << k) + 1; ++j)
                rmq[i][j][k] = max({rmq[i][j][k - 1], rmq[i + l][j][k - 1], rmq[i][j + l][k - 1], rmq[i + l][j + l][k - 1]});
    }

    while (m--) {

        int i, j, k;

        fin >> i >> j >> k;

        int p = put2[k], l = (1 << put2[k]);

        fout << max({rmq[i][j][p], rmq[i][j + k - l][p], rmq[i + k - l][j][p], rmq[i + k - l][j + k - l][p]}) << '\n';
    }

    return 0;
}