Cod sursa(job #178936)

Utilizator MirageRobert Sandu Mirage Data 15 aprilie 2008 13:19:30
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include<stdio.h>
inline int max(int a,int b){
	return a>b?a:b ;
}
int a[600][600][20],v[600][600],lg[600];
int main () {
	freopen("plantatie.in","r",stdin);
	freopen("plantatie.out","w",stdout);
	int i,j,k,n,m,x,y,z,maxim;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;++i)
		for(j=1;j<=n;++j)
			scanf("%d",&v[i][j]);
	for(i=2;i<=n;++i)
		lg[i]=lg[i>>1]+1;
	for(i=n;i>0;--i)
		for(j=n;j>0;--j){
			a[i][j][0]=v[i][j];
			for(k=1;i+(1<<k)<=n+1&&j+(1<<k)<=n+1;++k){
				a[i][j][k]=max(a[i][j][k-1],a[i+(1<<(k-1))][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][j+(1<<(k-1))][k-1]);
			}
		}
	for(i=0;i<m;++i){
		scanf("%d%d%d",&x,&y,&z);
		j=lg[z];
		maxim=max(a[x][y][j],a[x+z-(1<<j)][y][j]);
		maxim=max(maxim,a[x][y+z-(1<<j)][j]);
		maxim=max(maxim,a[x+z-(1<<j)][y+z-(1<<j)][j]);
		printf("%d\n",maxim);
	}
	return 0;
}