Cod sursa(job #3286436)

Utilizator robert_dumitruDumitru Robert Ionut robert_dumitru Data 14 martie 2025 10:50:43
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <bits/stdc++.h>
using namespace std;

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

int n, Q;
int a[505][505], rmq[10][505][505], e[505];

void BuildRMQ()
{
    int i, j, k, L;
    e[1] = 0;
    for (i = 2; i <= n; i++)
        e[i] = 1 + e[i / 2];

    for (i = 1; i <= n; i++)
        for (j = 1; j <= n; j++)
            rmq[0][i][j] = a[i][j];

    for (k = 1; k <= e[n]; k++)
    {
        L = (1 << (k - 1));
        for (i = 1; i <= n - 2 * L + 1; i++)
            for (j = 1; j <= n - 2 * L + 1; j++)
                rmq[k][i][j] = max({rmq[k - 1][i][j], rmq[k - 1][i + L][j],
                                    rmq[k - 1][i][j + L], rmq[k - 1][i + L][j + L]});
    }
}
int Query(int i, int j, int k)
{
    int expo, L;
    expo = e[k];
    L = (1 << expo);
    return max({rmq[expo][i][j], rmq[expo][i + k - L][j],
               rmq[expo][i][j + k - L], rmq[expo][i + k - L][j + k - L]});
}

int main()
{
    int i, j, k;
    fin >> n >> Q;
    for (i = 1; i <= n; i++)
        for (j = 1; j <= n; j++)
            fin >> a[i][j];

    BuildRMQ();
    while (Q--)
    {
        fin >> i >> j >> k;
        fout << Query(i, j, k) << "\n";
    }
    return 0;
}