Cod sursa(job #1046495)

Utilizator vld7Campeanu Vlad vld7 Data 2 decembrie 2013 23:02:35
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <fstream>

using namespace std;

ifstream f("plantatie.in");
ofstream g("plantatie.out");

const int MAX_N = 505;
const int MAX_LOG = 11;

int n, m, rmq[MAX_LOG][MAX_N][MAX_N], Log2[MAX_N];

void read() {
	f >> n >> m;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			f >> rmq[0][i][j];
}

void precompute() {
	Log2[1] = 0;
	for (int i = 2; i < MAX_N; i++)
		Log2[i] = Log2[i / 2] + 1;
	
	for (int k = 1; (1 << k) <= n; k++) {
		int prev = k - 1;
		int offset = (1 << prev);
		for (int i = 1; i + (1 << k) - 1 <= n; i++)
			for (int j = 1; j + (1 << k) - 1 <= n; j++)
				rmq[k][i][j] = max (max (rmq[prev][i][j], rmq[prev][i + offset][j]), max (rmq[prev][i][j + offset], rmq[prev][i + offset][j + offset]));
	}
}

void solve() {
	while (m--) {
		int i, j, k, p;
		
		f >> i >> j >> k;
		p = Log2[k];
		
		int nexti = i + k - 1;
		int nextj = j + k - 1;
		g << max (max (rmq[p][i][j], rmq[p][i][nextj - (1 << p) + 1]), max (rmq[p][nexti - (1 << p) + 1][j], rmq[p][nexti - (1 << p) + 1][nextj - (1 << p) + 1])) << '\n';
	}
}

int main() {
	read();
	precompute();
	solve();
	
	return 0;
}