Cod sursa(job #250498)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 31 ianuarie 2009 00:02:37
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
//cu masiv si RMQ
#include<stdio.h>
#define NM 256+513

int	b[10][NM][NM];
int a[NM][NM];
int main(){
freopen("plantatie.in","r",stdin);
freopen("plantatie.out","w",stdout);
int n,m,i,j,k,l,c,lat,pmax,p,x,t;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)
	for(j=1;j<=n;++j){
		scanf("%d",&a[i][j]);
		b[0][i][j]=a[i][j];
		}
k=0;p=1;
while(p<n) k++,p*=2;
x=k;p=1;
for(k=1;k<=x;++k){
	for(i=1;i<=n;++i)
		for(j=1;j<=n;++j){
			pmax=b[k-1][i][j];
			if(pmax<b[k-1][i+p][j+p]) pmax=b[k-1][i+p][j+p];
			if(pmax<b[k-1][i+p][j]) pmax=b[k-1][i+p][j];
			if(pmax<b[k-1][i][j+p]) pmax=b[k-1][i][j+p];
			b[k][i][j]=pmax;
			}
	p*=2;
	}
for(t=0;t<m;++t){
	scanf("%d%d%d",&l,&c,&lat);
	p=1;k=0;
	while(p<lat) k++,p*=2;
	if(p>lat) p/=2,k--;
	pmax=b[k][l][c];
	if(pmax<b[k][l][c+lat-p]) pmax=b[k][l][c+lat-p];
	if(pmax<b[k][l+lat-p][c]) pmax=b[k][l+lat-p][c];
	if(pmax<b[k][l+lat-p][c+lat-p]) pmax=b[k][l+lat-p][c+lat-p];
	printf("%d\n",pmax);
	}
return 0;
}