Cod sursa(job #183579)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 22 aprilie 2008 13:05:05
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <stdio.h>
#define max(a,b) ((a>b)?a:b)

long n,m,l,i,j,k,aux,x,y;
long lg[505],a[10][505][505];

int main(){
    freopen("plantatie.in","r",stdin);
    freopen("plantatie.out","w",stdout);
    
    scanf("%ld %ld",&n,&m);
    for (i=1;i<=n;i++)
        for (j=1;j<=n;j++)
            scanf("%ld",&a[0][i][j]);
    //preproc
    for (i=2;i<=n;i++)
        lg[i]=lg[i>>1]+1;
    l=lg[n];
    for (k=1;k<=l;k++)
        for (i=1; i+(1<<k)-1<=n ;i++)
            for (j=1; j+(1<<k)-1<=n ;j++){
                a[k][i][j]=max(a[k-1][i][j],a[k-1][i+(1<<(k-1))][j]);
                a[k][i][j]=max(a[k][i][j],  a[k-1][i][j+(1<<(k-1))]);
                a[k][i][j]=max(a[k][i][j],a[k-1][i+(1<<(k-1))][j+(1<<(k-1))]);
            }
    for (;m;--m){
        scanf("%ld %ld %ld\n",&x,&y,&l);
        k=lg[l];
        aux=max(a[k][x][y],a[k][x+l-(1<<k)][y]);
        aux=max(aux,a[k][x][y+l-(1<<k)]);
        aux=max(aux,a[k][x+l-(1<<k)][y+l-(1<<k)]);
        printf("%ld\n",aux);
    }
return 0;
}