Cod sursa(job #19374)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 19 februarie 2007 13:30:12
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <stdio.h>

const int N_MAX = 512;
const int P_MAX = 12;

int a[P_MAX][N_MAX][N_MAX];

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

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

	int M, N, i, j, k, x, y, l, put;
	scanf("%d %d\n", &N, &M);
	for (i = 1; i <= N; i ++) {
		for (j = 1; j <= N; j ++) {
			scanf("%d ", &a[0][i][j]);
		}
	}

	int nr = 1;
	for (nr = 2, k = 1; nr <= N; nr *= 2, k ++) {
		for (i = 1; i <= N; i ++) {
			for (j = 1; j <= N; 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))]));
			}
		}
	}
	
	for (; M; M --) {
		scanf("%d %d %d\n", &x, &y, &l);
		for (nr = 1, put = 0; nr <= l; nr *= 2, put ++);
		if (nr > l) {
			put --;
		}

		printf("%d\n", MAX(MAX(a[put][x][y], a[put][x][y + (l - (1 << put))]), MAX(a[put][x + (l - (1 << put))][y], a[put][x + (l - (1 << put))][y + (l - (1 << put))])));
	}
	
	return 0;
}