Cod sursa(job #110856)

Utilizator luana_0105Fagarasan Luana luana_0105 Data 27 noiembrie 2007 21:02:24
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <cstdio>
int n,m,i,j,k,p,l,put,a[501][501][10]; 

int max(int a, int b, int c, int d)
{
    if(a<b) a=b;
    if(a<c) a=c;
    if(a<d) a=d;
    return a;
}

void solve ()
{
   p=0;
   int pp=1; 
   put=2;
   while(pp*2<=n)
   {
     pp*=2;
     p++;
   }  
   for(l=1;l<=p;l++)
    {
     for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
           if((i+put-1<=n)&&(j+put-1<=n))  
             a[i][j][l]=max(a[i][j][l-1],a[i+put/2][j][l-1],a[i][j+put/2][l-1],a[i+put/2][j+put/2][l-1]);
    put=put*2;
     }             
}

   
int main ()
{
    freopen("plantatie.in", "r", stdin);
    freopen("plantatie.out", "w", stdout);
    
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
       for(j=1;j<=n;j++)
          scanf("%d",&a[i][j][0]);
    solve();
   // printf("%d\n", a[5][5][2]);
    while (m!=0)
    { scanf("%d%d%d",&i,&j,&k);
      p=0;
      put=1;
      while(put*2<=k)
      {  put=put*2;
         p++;
      }
      int sol=max(a[i][j][p],a[i+k-put][j][p],a[i][j+k-put][p],a[i+k-put][j+k-put][p]);
      printf("%d\n",sol);
      m--;
   }   
    fclose(stdin);
    fclose(stdout);
    return 0;
}