Cod sursa(job #201072)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 29 iulie 2008 00:09:07
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <cstdio>
#include <algorithm>
#define IN "plantatie.in"
#define OUT "plantatie.out"
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX 1<<9

using namespace std;
int A[N_MAX][N_MAX][1<<4];
int N,M;
int lg[N_MAX],B[N_MAX];  

void scan()
{
	freopen(IN, "r",stdin);
	freopen(OUT, "w",stdout);
	scanf("%d%d", &N,&M);
	FOR(i,1,N)
		FOR(j,1,N)
			scanf("%d", &A[i][j][0]);
}

void solve()
{
	for(int k=1; (1<<k) <=N;++k)  
		for(int i=N;i>=1;--i)
			for(int j=N;j>=1;--j)
				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]) );  
	
	FOR(i,1,N)
	{
		if(i % 2)
			++lg[i];
		lg[i] = lg[i-1];
	}
	
	while(M--)
	{
		int i,j,k,p;
		scanf("%d%d%d\n",&i,&j,&k);
		p = lg[k];	
		printf("%d\n", max( max(A[i][j][p], A[i][j+k-(1<<p)][p]), max(A[i+k-(1<<p)][j][p], A[i+k-(1<<p)][j+k-(1<<p)][p]) ) );
	}	
}

int main()
{
	scan();
	solve();
	return 0;
}