Cod sursa(job #3190736)

Utilizator AndreasBossGamerBaragau Andreas AndreasBossGamer Data 7 ianuarie 2024 21:12:37
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <fstream>

using namespace std;

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

int n, t;

int rmq[9][501][501];
int E[501];

int maxim(int a, int b, int c, int d) {
	return max(max(a, b), max(c, d));
}

int main() {
	cin >> n >> t;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++) cin >> rmq[0][i][j];

	for (int p = 1; (1 << p) <= n; p++) {
		int len = (1 << p);
		for (int i = 1; i + len - 1 <= n; i++) {
			for (int j = 1; j + len - 1 <= n; j++) {
				int lungimeNoua = (len >> 1);
				rmq[p][i][j] = maxim(rmq[p - 1][i][j], rmq[p - 1][i + lungimeNoua][j], rmq[p - 1][i][j + lungimeNoua], rmq[p - 1][i + lungimeNoua][j + lungimeNoua]);
			}
		}
	}

	//precalc cea mai mare putere de 2
	E[1] = 0;
	for (int i = 2; i <= 500; i++) E[i] = 1 + E[i / 2];
	//

	for (int q = 0; q < t; q++) {
		int i, j, len;
		cin >> i >> j >> len;
		int putereMaxima = E[len];
		int lungimeNoua = (1 << putereMaxima);
		cout << maxim(rmq[putereMaxima][i][j], rmq[putereMaxima][i + len - lungimeNoua][j], rmq[putereMaxima][i][j + len - lungimeNoua], rmq[putereMaxima][i + len - lungimeNoua][j + len - lungimeNoua]) << '\n';
	}
}