Cod sursa(job #479135)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 23 august 2010 00:19:29
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <cstdio>

#define file_in "plantatie.in"
#define file_out "plantatie.out"

int n,m;
int a[10][510][510];
int l[510];

void citire()
{
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &n, &m);
	for (int i=1;i<=n;++i)
		 for (int j=1;j<=n;++j)
			  scanf("%d", &a[0][i][j]);
}

inline int max(int a, int b) { return a>b?a:b; }

void solve()
{
	int i,j,k;
	for (i=2;i<=n;++i) l[i]=l[i>>1]+1;
	for(k=1;(1<<k)<=n;++k) 
		 for (i=n-(1<<k)+1;i>=1;--i)
			  for (j=n-(1<<k)+1;j>=1;--j)
				   a[k][i][j]=max(max(a[k-1][i][j],a[k-1][i][j+(1<<(k-1))]),max(a[k-1][i+(1<<(k-1))][j],a[k-1][i+(1<<(k-1))][j+(1<<(k-1))]));
	while(m--)
	{
		scanf("%d %d %d", &i, &j, &k);
		int p=l[k];
		printf("%d\n", max(max(a[p][i][j], a[p][i][j+k-(1<<p)]),max(a[p][i+k-(1<<p)][j],a[p][i+k-(1<<p)][j+k-(1<<p)])));
	}

}	
int main()
{
	citire();
	solve();
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}