Cod sursa(job #1454326)

Utilizator theprdvtheprdv theprdv Data 26 iunie 2015 06:08:27
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>
#define MAXN 501
#define max(x, y) ((x) > (y) ? (x) : (y))

using namespace std;

int N, M, RMQ[9][MAXN][MAXN], log[MAXN];

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

	scanf("%d %d", &N, &M);
	for (int i = 1; i <= N; ++i)
		for (int j = 1; j <= N; ++j)
			scanf("%d", &RMQ[0][i][j]);
	for (int i = 2; i <= N; ++i) log[i] = log[i >> 1] + 1;

	for (int k = 1; (1 << k) <= N; ++k)
		for (int i = 1; i <= N - (1 << k) + 1; ++i)
			for (int j = 1; j <= N - (1 << k) + 1; ++j)
				RMQ[k][i][j] = max(max(RMQ[k - 1][i][j], RMQ[k - 1][i][j + (1 << (k - 1))]), 
									max(RMQ[k - 1][i + (1 << (k - 1))][j], RMQ[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))]));

	for (int row, i, j, k; M; --M)
		scanf("%d %d %d", &i, &j, &k),
		row = log[k],
		printf("%d\n", max(max(RMQ[row][i][j], RMQ[row][i][j + k - (1 << row)]),
							max(RMQ[row][i + k - (1 << row)][j], RMQ[row][i + k - (1 << row)][j + k - (1 << row)])));
	
	return 0;
}