Cod sursa(job #2001296)

Utilizator victoreVictor Popa victore Data 16 iulie 2017 12:59:43
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<cstdio>



using namespace std;

const int nmax=505;
int v[nmax][nmax];
int logb2[nmax],rmq[nmax][nmax][12];

inline int max(int a,int b)
{
    if(a>b)
        return a;
    return b;
}

int main()
{
    freopen("plantatie.in","r",stdin);
    freopen("plantatie.out","w",stdout);
    int n,m,i,j,k;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)
        for(j=1;j<=n;++j)
            scanf("%d",&v[i][j]),rmq[i][j][0]=v[i][j];
    for(k=1;(1<<k) <= n; ++k)
        for(i=1;i + (1<<k) - 1 <= n;++i)
            for(j=1; j + (1<<k) -1 <=n; ++j)
                rmq[i][j][k]=max( rmq[i+(1<<(k-1))][j][k-1] , max( rmq[i][j][k-1] , max( rmq[i][j+(1<<(k-1))][k-1] , rmq[i+(1<<(k-1))][j+(1<<(k-1))][k-1])));
    logb2[1]=0;
    for(i=2;i<=n;++i)
        logb2[i]=logb2[i/2]+1;
    int x,y,add,lg,rez;
    while(m--)
    {
        scanf("%d%d%d",&i,&j,&k);
        lg=logb2[k];
        add=k-(1<<lg);
        rez=max(rmq[i][j][lg],max(rmq[i][j+add][lg],max(rmq[i+add][j][lg],rmq[i+add][j+add][lg])));
        printf("%d\n",rez);
    }
}