Cod sursa(job #2954275)

Utilizator buruiana_stefanburuiana stefan buruiana_stefan Data 13 decembrie 2022 19:13:45
Problema Plantatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

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

int n,q;
int x, y, k;
int a[500][500];
int rmq[12][500][500];

void compute_rmq() {
	for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) rmq[0][i][j] = a[i][j];

	for (int p = 1; p <= log2(n); p++) {
		for (int i = (1 << p) - 1; i < n; i++) for (int j = (1 << p) - 1; j < n; j++) {
			rmq[p][i][j] = max(max( rmq[p-1][i][j]
							       ,rmq[p-1][i - (1 << (p-1))][j - (1 << (p - 1))]),
				               max(rmq[p - 1][i][j - (1 << (p - 1))]
					               ,rmq[p - 1][i - (1 << (p - 1))][j]));
		}
	}
}

int query(int c1x,int c1y,int c2x,int c2y) {
	int p = log2(c2x - c1x + 1);
	return max(max(rmq[p][c2x][c2y]
				   ,rmq[p][c1x + p - 1][c1y + p - 1]),
		       max(rmq[p][c2x][c1y + p - 1]
				   , rmq[p][c1x + p - 1][c2y]));
}

signed main() {
	cin >> n>> q;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> a[i][j];
		}
	}

	compute_rmq();

	while (q--) {
		cin >> x >> y >> k;
		cout << query(x - k + 1, y - k + 1, x, y) << '\n';
	}

}