Cod sursa(job #935629)

Utilizator rudarelLup Ionut rudarel Data 4 aprilie 2013 12:59:46
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <stdio.h>

#define NMAX 510
#define LGMAX 13

int N, M;

int a[LGMAX][NMAX][NMAX];
int p2[NMAX];

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

int main()
{
	int i, j, k, lg;
	
	freopen("plantatie.in", "r", stdin);
	freopen("plantatie.out", "w", stdout);

	scanf("%d %d", &N, &M);

	for (i = 1; i <= N; i++)
		for (j = 1; j <= N; j++)
			scanf("%d", &a[0][i][j]);

	for (lg = 1, k = 1; (lg << 1) <= N; lg <<= 1, k++)
		for (i = 1; i <= N - (lg << 1) + 1; i++)
			for (j = 1; j <= N - (lg << 1) + 1; j++)
				a[k][i][j] = MAX( MAX(a[k-1][i][j], a[k-1][i][j + lg]), MAX(a[k-1][i + lg][j], a[k-1][i + lg][j + lg]) );

	for (i = 1; i <= N; i++)
		if ((1 << (p2[i-1] + 1)) <= i) p2[i] = p2[i-1] + 1;
		else p2[i] = p2[i-1];

	int x, y, l;
	for (i = 1; i <= M; i++) {
		scanf("%d %d %d", &x, &y, &l);

		k = p2[l];
		lg = 1 << k;

		printf("%d\n", MAX( MAX(a[k][x][y], a[k][x][y + l - lg]), MAX(a[k][x + l - lg][y], a[k][x + l - lg][y + l - lg]) ) );
	}

fclose(stdin);
fclose(stdout);
return 0;
}