Cod sursa(job #178949)

Utilizator swift90Ionut Bogdanescu swift90 Data 15 aprilie 2008 13:27:58
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include<stdio.h>
int nr[10][512][512],log[512];
inline int max(int a,int b,int c,int d){
	int x,y;
	if(a>b)
		x=a;
	else
		x=b;
	if(c>d)
		y=c;
	else
		y=d;
	if(x>y)
		return x;
	return y;
}
int main(){
	freopen("plantatie.in","r",stdin);
	freopen("plantatie.out","w",stdout);
	int n,m,i,j,x,y,k;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;++i){
		for(j=1;j<=n;++j)
			scanf("%d",&nr[0][i][j]);
	}
	for(i=2;i<=n;++i)
		log[i]=log[i>>1]+1;
	
	for(k=1;k<=log[n];++k){
		for(i=1;i+(1<<k)<=n+1;++i){
			for(j=1;j+(1<<k)<=n+1;++j)
				nr[k][i][j]=max(nr[k-1][i][j],nr[k-1][i+(1<<(k-1))][j],nr[k-1][i][j+(1<<(k-1))],nr[k-1][i+(1<<(k-1))][j+(1<<(k-1))]);
		}
	}
	
	for(i=0;i<m;++i){
		scanf("%d%d%d",&x,&y,&k);
		j=log[k];
		printf("%d\n",max(nr[j][x][y],nr[j][x+k-(1<<j)][y],nr[j][x][y+k-(1<<j)],nr[j][x+k-(1<<j)][y+k-(1<<j)]));
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}