Cod sursa(job #205568)

Utilizator alexeiIacob Radu alexei Data 1 septembrie 2008 21:20:09
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<stdio.h>
#define NMAX 524

int A[10][NMAX][NMAX];
int lg[NMAX];
//misto problema
inline int max(const int a,const int b,const int c,const int d)
{
       int aux=-1;
       if( a>aux )
       aux=a;
       if( b>aux )
       aux=b;
       if( c>aux )
       aux=c;
       if( d>aux )
       aux=d;
return aux;
}

int main()
{
 freopen("plantatie.in","r",stdin);
 freopen("plantatie.out","w",stdout);
 
 int N,M;
 scanf("%d%d",&N,&M);
 
 int i,j,k;
 
 for(i=1; i<=N; ++i)
          for(j=1; j<=N; ++j)
          scanf("%d",&A[0][i][j]);
  
 int aux,ff;
 
 for( k=1; 1<<(k-1)< N; ++k){
      ff=1<<(k-1);
      for( i=N-ff; i; --i)
           for( j=N-ff; j; --j)
                A[k][i][j]=max( A[k-1][i][j], A[k-1][i+ ff][j], A[k-1][i][j+ff], A[k-1][i+ff][j+ff] );
 
 }
 
 int smen1=0,smen2=2;
 
 for(k=2; k<=N; ++k)
 {
          lg[k]=smen1;
          if( k==smen2 )
          {
              smen2<<=1;
              ++smen1;
          }
 }
 
 int x,y,p;
 
 while( M-- )
 {
          scanf("%d%d%d",&x,&y,&k);
          
          if( k==1 )
              printf("%d\n",A[0][x][y]);
          else
          {
          p=lg[k];
          printf("%d\n",max( A[ p ][ x ][ y ], A[ p ][ x+k-(1<<p) ][ y ], A[ p ][ x ][ y+k-(1<<p)], A[ p ][ x+k-(1<<p) ][ y+k-(1<<p) ] ) );
          }
 }

    return 0;
}