Cod sursa(job #3228695)

Utilizator cosmin983Pascale Cosmin cosmin983 Data 10 mai 2024 09:42:02
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>
#include <cmath>


using namespace std;


ifstream cin("plantatie.in");
ofstream cout("plantatie.out");


const int NMAX = 500;


int n, query, a[NMAX][NMAX], rmq[NMAX][NMAX][9];


void read() {
	cin >> n >> query;
	for (int index1 = 0; index1 < n; ++index1) {
		for (int index2 = 0; index2 < n; ++index2) {
			cin >> a[index1][index2];
			rmq[index1][index2][0] = a[index1][index2];
		}
	}
}


void compute() {
	int target = log2(n);


	for (int p = 1; p <= target; ++p) {
		for (int i = 0; i + (1 << p) <= n; ++i) {
			for (int j = 0; j + (1 << p) <= n; ++j) {
				int r1 = rmq[i][j][p - 1];
				int r2 = rmq[i][j + (1 << (p - 1))][p - 1];
				int r3 = rmq[i + (1 << (p - 1))][j][p - 1];
				int r4 = rmq[i + (1 << (p - 1))][j + (1 << (p - 1))][p - 1];


				rmq[i][j][p] = max(max(r1, r2), max(r3, r4));
			}
		}
	}
}


int rectangleQuery(int i, int j, int lenght) {
	int log = log2(lenght);


	int r1 = rmq[i][j][log];
	int r2 = rmq[i][j + lenght - (1 << log)][log];
	int r3 = rmq[i + lenght - (1 << log)][j][log];
	int r4 = rmq[i + lenght - (1 << log)][j + lenght - (1 << log)][log];


	return max(max(r1, r2), max(r3, r4));
}


void solve() {
	int i, j, k;
	cin >> i >> j >> k;


	cout << rectangleQuery(i - 1, j - 1, k) << '\n';
}


int main() {
	read();
	compute();
	while (query--) {
		solve();
	}
	return 0;
}