Cod sursa(job #200982)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 28 iulie 2008 11:51:23
Problema Plantatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <stdio.h>

#define NMAX 600

#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][NMAX];
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;
}



int descompune(int cif)
{
int nr;
nr=0;
while (cif%2==0)
      {
      ++nr;
      cif/=2;
      }
return nr;
}





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








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);
freopen(FOUT,"wt",stdout);

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

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

init();
solve();
}



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