Cod sursa(job #331765)

Utilizator crawlerPuni Andrei Paul crawler Data 15 iulie 2009 11:45:55
Problema Plantatie Scor 100
Compilator cpp Status done
Runda splunge2 Marime 1.18 kb
#include <stdio.h>

#define pow(q) (1<<(q))
#define Nmax 512

int a[Nmax][Nmax][9], n,m, p[Nmax];

int Max(int A,int B)
{
     if (A > B)     return A;
     return B;     
}

int main()
{
     freopen("plantatie.in","r",stdin);
     freopen("plantatie.out","w",stdout);
     
     scanf("%d%d", &n,&m);
     
     for (int i=1;i<=n;++i)
     for (int j=1;j<=n;++j)
          scanf("%d", &a[i][j][0]);
          
     for (int k=1;(1<<k) <= n; ++k)
     for (int i=1;i<=n;++i) if (i+pow(k-1) <= n)
     for (int j=1;j<=n;++j) if (j+pow(k-1) <= n)
          a[i][j][k] = Max( Max( a[i][j][k-1] , a[i+pow(k-1)][j+pow(k-1)][k-1] ) ,
                            Max( a[i+pow(k-1)][j][k-1] , a[i][j+pow(k-1)][k-1] ) );
     
     int tmp = 0;
     
     for (int i=1;i<=n;++i)
     {
          if (i==pow(tmp+1))
               ++tmp;
          p[i] = tmp;
     }
     
     #define Dif(q) (q-pow(p[q]))
     
     for (;m>0;--m)
     {
          int x,y,k;
          scanf("%d%d%d", &x,&y,&k);     
          printf("%d\n", Max(Max(a[x][y][p[k]],a[x+Dif(k)][y][p[k]]), Max(a[x][y+Dif(k)][p[k]],a[x+Dif(k)][y+Dif(k)][p[k]])));
     }
     
     return 0;     
}