Cod sursa(job #131183)

Utilizator razvi9Jurca Razvan razvi9 Data 3 februarie 2008 12:56:48
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.81 kb
#include<cstdio>
const int N=501,LG=10;
int a[N][N][LG],n,m,i,j,k,l,n1,n2;

int max2(int a,int b)
{if(a<b) return b;
 return a;}

int max(int a,int b,int c,int d)
{return max2(max2(a,b),max2(c,d));}

inline void build()
{
	for(k=1;(1<<k)<=n;k++){n1=(n-(1<<k)+1);n2=1<<(k-1);
		for(i=1;i<=n1;i++)
			for(j=1;j<=n1;j++)
				a[i][j][k]=max(a[i][j][k-1],a[i+n2][j][k-1],a[i+n2][j+n2][k-1],a[i][j+n2][k-1]);}
}


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]);
 build();
 for(;m;--m){
	 scanf("%d %d %d",&i,&j,&k);
	 for(l=0;(1<<l)<=k;l++);
	 l--;
	 printf("%d\n",max(a[i][j][l],a[i+k-(1<<l)][j][l],a[i][j+k-(1<<l)][l],a[i+k-(1<<l)][j+k-(1<<l)][l]));}
 fclose(stdout);
 return 0;}