Cod sursa(job #201033)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 28 iulie 2008 17:50:27
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <stdio.h>
#define N 503
long long a[N][N][10],log[N],n,m;
inline long long max(long long x,long long y){
	if(x>y) return x;
	return y;
}
void logaritm(){
	int x=0;
	for(int i=0;i<=n;i++)
		if((1<<x)>i)
			log[i]=x-1;
		else log[i]=x++;
}
void rmq(){
	int i,j,k;
	for(i=n;i>=1;i--)
		for(j=n;j>=1;j--)
			for(k=1;i+(1<<k)<=n+1 && j+(1<<k)<=n+1;k++)
				a[i][j][k]=max(max(a[i][j][k-1],a[i+(1<<(k-1))][j][k-1]),max(a[i][j+(1<<(k-1))][k-1],a[i+(1<<(k-1))][j+(1<<(k-1))][k-1]));
}
int main(){
	int i,j,l,k,t;
	long long sol;
	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("%lld",&a[i][j][0]);
	rmq();logaritm();
	for(t=1;t<=m;t++){
		scanf("%d%d%d",&i,&j,&k);
		l=log[k];
		sol=max(max(a[i][j][l],a[k-(1<<l)+i][j][l]),max(a[i][j+k-(1<<l)][l],a[i+k-(1<<l)][j+k-(1<<l)][l]));
		printf("%lld\n",sol);
	}
	return 0;
}