Cod sursa(job #531445)

Utilizator Addy.Adrian Draghici Addy. Data 9 februarie 2011 18:12:59
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define LOG_MAX 10
#define NMAX 512

int RMQ[LOG_MAX][NMAX][NMAX], log[NMAX], n, t, i, j, k, a, b, c, d, p;

int main () {
	
	freopen ("plantatie.in", "r", stdin);
	freopen ("plantatie.out", "w", stdout);
	
	scanf ("%d %d", &n, &t);
	for (i = 1; i <= n; i++)
		for (j = 1; j <= n; j++)
			scanf ("%d", &RMQ[0][i][j]);
	
	for (i = 2; i <= n; i++)
		log[i] = log[i >> 1] + 1;
	
	for (k = 1; (1 << k) <= n; k++)
		for (i = 1; i + (1 << k) - 1 <= n; i++)
			for (j = 1; j + (1 << k) - 1 <= n; j++) {
				a = RMQ[k-1][i][j], b = RMQ[k-1][i + (1 << (k - 1))][j], c = RMQ[k-1][i][j + (1 << (k - 1))], d = RMQ[k-1][i + (1 << (k - 1))][j + (1 << (k - 1))];
				RMQ[k][i][j] = max (a, max (b, max (c, d)));
			}
	
	for ( ; t; t--) {
		scanf ("%d %d %d", &i, &j, &k);
		p = log[k];
		a = RMQ[p][i][j], b = RMQ[p][i - (1 << p) + k][j], c = RMQ[p][i][j - (1 << p) + k], d = RMQ[p][i - (1 << p) + k][j - (1 << p) + k];
		printf ("%d\n", max (a, max (b, max (c, d))));
	}
	
	return 0;
}