Cod sursa(job #200995)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 28 iulie 2008 12:02:44
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <stdio.h>

#define NMAX 710
#define NMIN 10

#define FIN "plantatie.in"
#define FOUT "plantatie.out"


int x,n,q1,q2,q3,p,w,i,j,k,m,ii;
int A[NMAX][NMAX][NMIN];
int B[NMAX];

int max(int a, int b, int c, int d)
{
int maxim;

maxim=1;

if (a>maxim)
    maxim=a;

if (b>maxim)
    maxim=b;

if (c>maxim)
    maxim=c;

if (d>maxim)
    maxim=d;

return maxim;
}



void solve()
{
for (i=1;i<=m;++i)
    {
     scanf("%d %d %d", &q1,&q2,&q3);
       for (ii=2;ii<=n;++ii)
       B[ii]=B[ii>>1]+1;
      printf("%d\n",max(A[q1][q2][B[q3]],A[q1][q2+q3-(1<<B[q3])][B[q3]],A[q1+q3-(1<<B[q3])][q2][B[q3]],A[q1+q3-(1<<B[q3])][q2+q3-(1<<B[q3])][B[q3]]));
     }
}



void init()
{

 for(k=1; (1<<k) <=n;++k)
     for(i=1;i<=n;++i)
	 for(j=1;j<=n;++j)

	 A[i][j][k]=max(A[i][j][k-1],A[i+(1<<(k-1))][j][k-1],A[i][j+(1<<(k-1))][k-1],A[i+(1<<(k-1))][j+(1<<(k-1))][k-1]);

}

void read()
{

freopen(FIN,"rt",stdin);

scanf("%d %d", &n, &m);

for (i=1;i<=n;++i)
     for (j=1;j<=n;++j)
	  scanf("%d", &A[i][j][0]);

init();
freopen(FOUT,"wt",stdout);
solve();
}



int main()
{
read();
return 0;
}