Cod sursa(job #18161)

Utilizator crawlerPuni Andrei Paul crawler Data 18 februarie 2007 10:15:05
Problema Plantatie Scor 60
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasa a 10-a Marime 1.34 kb
#include <stdio.h>


#define FOR(i,a,b) for( i = (a); i <= (b); ++i)
#define pow(x) (1<<x)

#define fin "plantatie.in"
#define fout "plantatie.out"


int a[512][512][11], n;
int log[512];

int main()
 {
   freopen(fin,"r",stdin);
   freopen(fout,"w",stdout);


   int i,j, k, m, t;

   t=0;
   FOR(i,1,505)
    {
     log[i]=t;
     if(i+1==pow(t+1))
      ++t;
    }

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

   FOR(i,1,n)
    FOR(j,1,n)
     scanf("%i", &a[i][j][0]);


   for(k = 0; pow(k) <= n; ++k)
    for(i = 1; i <= n; ++i)
     for(j = 1; j <= n; ++j)
      {
       a[i][j][k+1]=a[i][j][k];

       if(a[i][j][k+1]<a[i+pow(k)][j][k])
        a[i][j][k+1]=a[i+pow(k)][j][k];

       if(a[i][j][k+1]<a[i+pow(k)][j+pow(k)][k])
        a[i][j][k+1]=a[i+pow(k)][j+pow(k)][k];

       if(a[i][j][k+1]<a[i][j+pow(k)][k])
        a[i][j][k+1]=a[i][j+pow(k)][k];
      }

   int dif, q, max, ii, jj;

   FOR(t,1,m)
    {
     scanf("%i%i%i", &i,&j,&k);

     q=log[k];

     dif=k-pow(q);

     max=a[i][j][q];
     
     if(dif>0)
      {
       ii=i+dif;jj=j+dif;
       
       if(max < a[ii][j][q])
        max=a[ii][j][q];

       if(max < a[i][jj][q])
        max=a[i][jj][q];

       if(max < a[ii][jj][q])
        max=a[ii][jj][q];
      }

     printf("%i\n", max);
    }

   return 0;
 }