Cod sursa(job #2278273)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 7 noiembrie 2018 15:54:09
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <iostream>
#include <cstdio>

using namespace std;

const int N=500+5;
const int LOG=10;

int n,t;
int rmq[N][N][LOG];
int lg2[N];

int main()
{
    freopen("plantatie.in","r",stdin);
    freopen("plantatie.out","w",stdout);
    scanf("%d %d",&n,&t);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            scanf("%d",&rmq[i][j][0]);
        }
    }
    for(register int i=2;i<N;i++)
    {
        lg2[i]=lg2[i/2]+1;
    }
    for(register int lg=1;(1<<lg)<=n;lg++)
    {
        for(register int i=1;i+(1<<lg)-1<=n;i++)
        {
            for(register int j=1;j+(1<<lg)-1<=n;j++)
            {
                rmq[i][j][lg]=rmq[i][j][lg-1];
                rmq[i][j][lg]=max(rmq[i][j][lg],rmq[i][j+(1<<(lg-1))][lg-1]);
                rmq[i][j][lg]=max(rmq[i][j][lg],rmq[i+(1<<(lg-1))][j][lg-1]);
                rmq[i][j][lg]=max(rmq[i][j][lg],rmq[i+(1<<(lg-1))][j+(1<<(lg-1))][lg-1]);
            }
        }
    }
    for(int tc=1;tc<=t;tc++)
    {
        int r,c,len;
        cin>>r>>c>>len;
        int re=r+len-1;
        int ce=c+len-1;
        int lg=lg2[len];
        int ans=0;
        ans=rmq[r][c][lg];
        ans=max(ans,rmq[r][ce-(1<<lg)+1][lg]);
        ans=max(ans,rmq[re-(1<<lg)+1][c][lg]);
        ans=max(ans,rmq[re-(1<<lg)+1][ce-(1<<lg)+1][lg]);
        cout<<ans<<"\n";
    }
    return 0;
}