Cod sursa(job #2961591)

Utilizator LucaMuresanMuresan Luca Valentin LucaMuresan Data 6 ianuarie 2023 18:57:13
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <bits/stdc++.h>

using namespace std;

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

int n;
int p[10] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512};

int rmq[501][501][9];

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

int query (int x1, int y1, int x2, int y2)
{
    int k = __lg(x2-x1+1);
    return max({rmq[x1][y1][k], rmq[x2-p[k]+1][y2-p[k]+1][k], rmq[x1][y2-p[k]+1][k], rmq[x2-p[k]+1][y1][k]});
}

int main()
{
    int q;
    in >> n >> q;

    for (int i=1; i<=n; i++)
    {
        for (int j=1; j<=n; j++)
        {
            in >> rmq[i][j][0];
        }
    }

    pp();

    while (q--)
    {
        int x, y, k;
        in >> x >> y >> k;

        out << query(x, y, x+k-1, y+k-1) << '\n';
    }

    return 0;
}