Cod sursa(job #161020)

Utilizator CezarMocanCezar Mocan CezarMocan Data 17 martie 2008 15:09:05
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <cstdio>
#include <cstring>

using namespace std;

long n,m,i,j,k,v[512][512],l,c,b,rez,q;
long a[512][512][16],p[1024]; 

int main(){
freopen("plantatie.in","r",stdin);
freopen("plantatie.out","w",stdout);
memset(a, 0, sizeof(a));
p[1]=0;
for (i=2;i<=1001;++i)
    p[i]=p[i/2]+1;
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
    for (j=1;j<=n;j++)
        {
        scanf("%d",&v[i][j]);
        a[i][j][0]=v[i][j];
        }
for (k=1;k<=p[n];k++)
    {
    q=1<<(k-1);
    for (i=1;i<=n;i++)
        for (j=1;j<=n;j++)
            if ((j+q<=n)&&(i+q<=n))
            {
            a[i][j][k]=a[i][j][k-1];
            if (a[i][j+q][k-1]>a[i][j][k])
                a[i][j][k]=a[i][j+q][k-1];
            if (a[i+q][j][k-1]>a[i][j][k])
                a[i][j][k]=a[i+q][j][k-1];
            if (a[i+q][j+q][k-1]>a[i][j][k])
                a[i][j][k]=a[i+q][j+q][k-1];                
            }
    }
for (i=1;i<=m;i++)
    {
    scanf("%d%d%d",&c,&b,&k);
    l=p[k];
    q=1<<l;
    rez=a[c][b][l]; 
    if (a[c][b-q+k][l]>rez)
        rez=a[c][b-q+k][l];
    if (a[c-q+k][b][l]>rez)
        rez=a[c-q+k][b][l];
    if (a[c-q+k][b-q+k][l]>rez)
        rez=a[c-q+k][b-q+k][l]; 
    printf("%d\n",rez);       
    }
return 0;
}