Cod sursa(job #3183213)

Utilizator davidgeo123Georgescu David davidgeo123 Data 11 decembrie 2023 09:43:21
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>

using namespace std;

int maxim(int a, int b, int c, int d)
{
    return max(max(a, b), max(c, d));
}
int main()
{
    freopen("plantatie.in", "r", stdin);
    freopen("plantatie.out", "w", stdout);
    int n, q;
    cin>>n>>q;
    int rmq[25][n+1][n+1];
    ///[bit][i][j]->patrat de lungime bit
    ///min (i, j)...(i+(2^bit)-1)(j+(2^bit)-1)
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            cin>>rmq[0][i][j];
    for(int b=1; b<=24; b++)
    {
        for(int i=1; i+(1<<b)-1<=n; i++)
        {
            for(int j=1; j+(1<<b)-1<=n; j++)
            {
                int i2=i+(1<<(b-1));
                int j2=j+(1<<(b-1));
                rmq[b][i][j]=maxim(
                    rmq[b-1][i][j],
                    rmq[b-1][i2][j],
                    rmq[b-1][i][j2],
                    rmq[b-1][i2][j2]);
            }
        }
    }
    int lg[n+1];
    lg[1]=0;
    for(int i=2; i<=n; i++)
        lg[i]=1+lg[i/2];
    while(q--)
    {
        int i1, j1, len;
        cin>>i1>>j1>>len;
        int layer=lg[len];
        int lungime=(1<<layer);
        int i2=i1+len-lungime;
        int j2=j1+len-lungime;
        int min1=rmq[layer][i1][j1];
        int min2=rmq[layer][i1][j2];
        int min3=rmq[layer][i2][j1];
        int min4=rmq[layer][i2][j2];
        cout<<max(max(min1, min2), max(min3, min4))<<'\n';
    }
    return 0;
}