Cod sursa(job #204489)

Utilizator rapidu36Victor Manz rapidu36 Data 24 august 2008 16:20:23
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include<stdio.h>
#define N 505
#define L 10

int m,n,a[N][N][L],v[N][N];

inline int maxim(int a1,int a2,int a3,int a4){
	int m=a1;
	if(a2>m)
		m=a2;
	if(a3>m)
		m=a3;
	if(a4>m)
		m=a4;
	return m;
}

void init(){
	int i,j,k,p;
	for(i=n ; i ;--i)
		for(j=n ; j ; --j){
			a[i][j][0]=v[i][j];
			for(k=1 ; i+(1<<k)-1<=n && j+(1<<k)-1<=n ; ++k){
				p=1<<(k-1);
				a[i][j][k]=maxim(a[i][j][k-1],a[i][j+p][k-1],a[i+p][j][k-1],a[i+p][j+p][k-1]);
			}
		}
}

inline int doi(int k){
	int p=1,nr=0;
	while(p<=k){
		p<<=1;
		++nr;
	}
	return nr-1;
}

inline int rez(int i,int j,int k){
	int p=doi(k),kk;
	kk=1<<p;
	return maxim(a[i][j][p],a[i][j+k-kk][p],a[i+k-kk][j][p],a[i+k-kk][j+k-kk][p]);
}

void calcul(){
	int i,j,k;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;++i)
		for(j=1;j<=n;++j)
			scanf("%d",&v[i][j]);
	init();
	while(m--){
		scanf("%d%d%d",&i,&j,&k);
		printf("%d\n",rez(i,j,k));
	}
}

int main(){
	freopen("plantatie.in","r",stdin);
	freopen("plantatie.out","w",stdout);
	calcul();
	return 0;
}