Cod sursa(job #201293)

Utilizator AndreyPAndrei Poenaru AndreyP Data 30 iulie 2008 11:21:25
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include<stdio.h>
#define N 502
#define L 11
int n,m;
int a[L][N][N];
int lg[N];
inline int max(int x,int y,int z,int t)
{
	if(y>x)
		x=y;
	if(z>x)
		x=z;
	if(t>x)
		x=t;
	return x;
}
int main()
{
	freopen("plantatie.in","r",stdin);
	freopen("plantatie.out","w",stdout);
	scanf("%d%d",&n,&m);
	int i,j,k,aux,aux1,x,y,z,dify,difx,log;
	for(i=1; i<=n; i++)
	{
		for(j=1; j<=n; j++)
			scanf("%d",&a[0][i][j]);
	}
	
	for(i=2; i<=n; i++)
		lg[i]=lg[i>>1]+1;
	
	for(i=1; i<=lg[n]; i++)
	{
		aux=n-(1<<i)+1;
		aux1=1<<(i-1);
		for(j=1; j<=aux; j++)
		{
			for(k=1; k<=aux; k++)
				a[i][j][k]=max(a[i-1][j][k],a[i-1][j+aux1][k],a[i-1][j][k+aux1],a[i-1][j+aux1][k+aux1]);
		}
	}
	
	for(i=0; i<m; i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		log=lg[z];
		dify=y+z-(1<<log);
		difx=x+z-(1<<log);
		printf("%d\n",max(a[log][x][y],a[log][difx][y],a[log][x][dify],a[log][difx][dify]));
	}
	return 0;
}