Cod sursa(job #19416)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 19 februarie 2007 14:56:59
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <stdio.h>

#define maxn 510
#define maxl 10

int n,m;
int a[maxl][maxn][maxn];
int T[maxn];

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

int main()
{
    freopen("plantatie.in","r",stdin);
    freopen("plantatie.out","w",stdout);
    
    scanf("%d %d",&n,&m);
    
    int i,j,k,x,y,z,t,aux;
    
    for (i=1;i<=n;i++)
      for (j=1;j<=n;j++) scanf("%d ",&a[0][i][j]);
      
    for (k=1;k<maxl;k++)
    {
      aux=1<<(k-1);
      for (i=1;i<=n;i++)
        for (j=1;j<=n;j++)
        {
            x=a[k-1][i][j];
            if (i+aux>n) y=0;
            else y=a[k-1][i+aux][j];
            if (j+aux>n) z=0;
            else z=a[k-1][i][j+aux];
            if ((j+aux>n) || (i+aux>n)) t=0;
            else t=a[k-1][i+aux][j+aux];
            a[k][i][j]=max(x,y,z,t);
        }
    }
    
    T[1]=0;
    for (i=2;i<=n;i++) 
      if (1<<(T[i-1]+1)<=i) T[i]=T[i-1]+1;
      else T[i]=T[i-1];
      
    for (i=1;i<=m;i++)
    {
        scanf("%d %d %d",&x,&y,&z);
        aux=(1<<T[z]);
        printf("%d\n",max(a[T[z]][x][y],a[T[z]][x+z-aux][y],a[T[z]][x][y+z-aux],a[T[z]][x+z-aux][y+z-aux]));
    }
    
    return 0;
}