Cod sursa(job #107919)

Utilizator raula_sanChis Raoul raula_san Data 20 noiembrie 2007 21:29:36
Problema Plantatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <cstdio>

#define dim 501
#define log 10

int N, M, Sol;

int P[dim], A[dim][dim], B[dim][dim][log];

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

int main()
{
	freopen("plantatie.in", "rt", stdin);
	freopen("plantatie.out", "wt", stdout);
	
	int i, j, k, l, q;
	
	for(scanf("%d %d", &N, &M), i=1; i<=N; ++i)
		for(j=1; j<=N; ++j) scanf("%d", &A[i][j]);
	
	P[1] = 0;
	for(i=2; i<=N; ++i)
		if( 1 << (P[i-1] + 1) <= i )
			P[i] = P[i-1] + 1;
		else
			P[i] = P[i-1];
			
	for(k=N, l=0; k; k>>=1, ++l);

	for(i=1; i<=N; ++i)
		for(j=1; j<=N; ++j) B[i][j][0] = A[i][j];

	-- l;
	for(k=1; k<=l; ++k)
		for(i=1; i<=N; ++i)
			for(j=1; j<=N; ++j)
				if(i + (1 << k) <= N && j + (1 << k) <= N)
				{
				B[i][j][k] = B[i][j][k-1];
				B[i][j][k] = max(B[i][j][k], B[i][j+(1<<(k-1))][k-1]);
				B[i][j][k] = max(B[i][j][k], B[i+(1<<(k-1))][j][k-1]);
				B[i][j][k] = max(B[i][j][k], B[i+(1<<(k-1))][j+(1<<(k-1))][k-1]);
				}

	int p;

	for(q=1; q<=M; ++q)
	{
		scanf("%d %d %d", &i, &j, &l);
		k = P[l];
		p = 1 << k;

		Sol = B[i][j][k];
		Sol = max(Sol, B[i+l-p][j][k]);
		Sol = max(Sol, B[i][j+l-p][k]);
		Sol = max(Sol, B[i+l-p][j+l-p][k]);

		printf("%d\n", Sol);
	}

	fclose(stdin);
	fclose(stdout);

	return 0;
}