Cod sursa(job #3301727)

Utilizator Ruxandra009Ruxandra Vasilescu Ruxandra009 Data 29 iunie 2025 13:20:33
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <fstream>

using namespace std;

const string txt = "plantatie";

ifstream f(txt + ".in");
ofstream g(txt + ".out");

int n, q, rmq[505][505][20], loog[505];

void Range_Max()
{
	for (int i = 2; i <= n; i++) loog[i] = loog[i / 2] + 1;

	for (int t = 1; t <= loog[n]; t++)
	{
		for (int i = 1; i <= n - (1 << t) + 1; i++)
			for (int j = 1; j <= n - (1 << t) + 1; j++) {
				int m1 = max(rmq[i][j][t - 1], rmq[i + (1 << (t - 1))][j][t - 1]);
				int m2 = max(rmq[i][j + (1 << (t - 1))][t - 1], rmq[i + (1 << (t - 1))][j + (1 << (t - 1))][t - 1]);
				rmq[i][j][t] = max(m1, m2);
			}
	}
}

int maxim(int l, int c, int nr)
{
	int l2 = l + nr - 1, c2 = c + nr - 1;
	int num = loog[nr];

	int ans = max(rmq[l][c][num], rmq[l2 - (1 << num) + 1][c][num]);
	int ans2 = max(rmq[l][c2 - (1 << num) + 1][num], rmq[l2 - (1 << num) + 1][c2 - (1 << num) + 1][num]);

	return max(ans, ans2);
}

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

	Range_Max();

	for (; q >= 1; q--)
	{
		int x, y, lg; f >> x >> y >> lg;
		g << maxim(x, y, lg) << '\n';
	}
	return 0;
}