Cod sursa(job #18716)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 18 februarie 2007 13:01:00
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <stdio.h>

#define MAXN 512

int N, M;
int x[MAXN][MAXN], Max[10][MAXN][MAXN];
int lg[MAXN];

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

inline int max( int a, int b, int c, int d )
{
	return max2( max2(a, b), max2(c, d) );
}

int main()
{
	freopen("plantatie.in", "rt", stdin);
	freopen("plantatie.out", "wt", stdout);
	scanf("%d %d", &N, &M);
	int i, j, k;
	for (lg[1] = 0, i = 2, j = 0; i < MAXN; i++)
	{
		if (i == (1 << (j + 1)))
			j++;
		lg[i] = j;
	}
	for (i = 0; i < N; i++)
		for (j = 0; j < N; j++)
		{
			scanf("%d", &k);
			Max[0][i][j] = x[i][j] = k;
		}

	for (k = 1; k < 10; k++) for (i = 0; i + (1 << k) - 1 < N; i++) for (j = 0; j + (1 << k) - 1 < N; j++)
	{
		int p2 = 1 << (k - 1);
		Max[k][i][j] = max( Max[k - 1][i][j],
				    Max[k - 1][i + p2][j], 
				    Max[k - 1][i][j + p2],
				    Max[k - 1][i + p2][j + p2] );
	}

	for (; M; M--)
	{
		int a, b;
		scanf("%d %d %d", &i, &j, &k);
		i--; j--;
		a = i + k - 1;
		b = j + k - 1;
		printf("%d\n", max( Max[lg[k]][i][j],
				    Max[lg[k]][a - (1 << lg[k]) + 1][j],
				    Max[lg[k]][i][b - (1 << lg[k]) + 1],
				    Max[lg[k]][a - (1 << lg[k]) + 1][b - (1 << lg[k]) + 1] ));
	}
	return 0;
}