Cod sursa(job #184576)

Utilizator firewizardLucian Dobre firewizard Data 23 aprilie 2008 21:12:23
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <stdio.h>   
#include <vector>
#define NMAX 505
#define max(a,b) ( ( a > b) ? a : b )  
long int n,m;   
long int lg[NMAX];   
long int a[NMAX][NMAX][10];   
  
int main()   
{   
    freopen("plantatie.in","r",stdin);   
    freopen("plantatie.out","w",stdout);   
  
    long int i,j,l,k;   
  
    scanf("%ld %ld",&n,&m);   
  
    for (i=1;i<=n;i++)   
        for (j=1;j<=n;j++)      
        scanf("%ld ",&a[i][j][0]);   
  
    for (i=2;i<=n;i++)   
        lg[i]=lg[i/2]+1;   
  l=lg[n];  
  
  for (k=1;k<=l;++k)            
    for (i=1;i<=n-(1<<k)+1;++i)   
        for (j=1;j<=n-(1<<k)+1;++j)   
        {   
        a[i][j][k]=max(a[i][j][k-1],a[i][j+(1<<(k-1))][k-1]);
        a[i][j][k]=max(a[i][j][k],a[i+(1<<(k-1))][j][k-1]);
        a[i][j][k]=max(a[i][j][k],a[i+(1<<(k-1))][j+(1<<(k-1))][k-1]);  
        }   
  
    long int x,y,p,rez;   
       
    for (;m;--m)   
    {   
        scanf("%ld %ld %ld",&x,&y,&l);
        p=lg[l];
        rez=max(a[x][y][p],a[x][y+l-(1<<p)][p]);
        rez=max(rez,a[x+l-(1<<p)][y][p]);
        rez=max(rez,a[x+l-(1<<p)][y+l-(1<<p)][p]);      
        printf("%ld\n",rez);   
    }      
    return 0;   
}