Cod sursa(job #3284564)

Utilizator robert_dumitruDumitru Robert Ionut robert_dumitru Data 11 martie 2025 21:36:20
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <bits/stdc++.h>
using namespace std;
//aproapeperm
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");

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

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

    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][j + L],
                           rmq[k - 1][i + L][j], rmq[k - 1][i + L][j + L]});
    }
}
int Query(int x, int y, int k)
{
    int expo, L;
    expo = e[k];
    L = (1 << expo);
    return max({rmq[expo][x][y], rmq[expo][x][y + k - L],
               rmq[expo][x + k - L][y], rmq[expo][x + k - L][y + 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;
}