Cod sursa(job #1413287)

Utilizator vladrochianVlad Rochian vladrochian Data 1 aprilie 2015 19:37:41
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <fstream>
using namespace std;

const int kMaxN = 505;
const int kMaxLg = 9;

ifstream fin("plantatie.in");
ofstream fout("plantatie.out");

int N, M, lg2[kMaxN];
int a[kMaxLg][kMaxN][kMaxN];

int Query(int x, int y, int l) {
	int lg = lg2[l];
	return max(max(a[lg][x][y], a[lg][x + l - (1 << lg)][y]),
	           max(a[lg][x][y + l - (1 << lg)], a[lg][x + l - (1 << lg)][y + l - (1 << lg)]));
}

int main() {
	fin >> N >> M;
	for (int i = 1; i <= N; ++i)
		for (int j = 1; j <= N; ++j)
			fin >> a[0][i][j];

	for (int i = 2; i <= N; ++i)
		lg2[i] = lg2[i >> 1] + 1;

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

	while (M--) {
		int x, y, l;
		fin >> x >> y >> l;
		fout << Query(x, y, l) << "\n";
	}
	return 0;
}