Cod sursa(job #3330585)

Utilizator herbiHreban Antoniu George herbi Data 20 decembrie 2025 12:07:53
Problema Plantatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
//ifstream fin("plantatie.in");
//ofstream fout("plantatie.out");
#define fin cin
#define fout cout
vector<vector<int>>v;
vector<int>lg;
vector<vector<vector<int>>>m;
int n, x, y, z, q, k;
const int inf = 1 << 30;
int main()
{
	cin >> n >> q;
	v.resize(n + 1, vector<int>(n + 1));
	lg.resize(n + 1);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			fin >> v[i][j];

	lg[1] = 0;
	for (int i = 2; i <= n; i++)
		lg[i] = lg[i / 2] + 1;

	m.resize(lg[n] + 1, vector<vector<int>>(n + 1, vector<int>(n + 1)));
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			m[0][i][j] = v[i][j];

	for (int k = 1; (1 << k) <= n; k++)
	{
		for (int i = 1; i + (1 << k) <= n + 1; i++)
		{
			for (int j = 1; j + (1 << k) <= n + 1; j++)
			{
				m[k][i][j] = max(m[k - 1][i][j], m[k - 1][i][j + (1 << (k-1))]);
				m[k][i][j] = max(m[k][i][j], m[k - 1][i + (1 << (k-1))][j]);
				m[k][i][j] = max(m[k][i][j], m[k - 1][i + (1 << (k-1))][j + (1 << (k-1))]);
			}
		}
	}
	cout << 1;
	for (int i = 1; i <= q; i++)
	{
		fin >> x >> y >> z;
		int xi = x + z - 1;
		int yi = y + z - 1;
		k = lg[z];
		int minn = inf;
		minn = min(m[k - 1][x][y], m[k - 1][x][y+ (1 << k)]);
		minn = min(minn, m[k - 1][xi - (1 << k)+1][y]);
		minn = min(minn, m[k - 1][xi - (1 << k)+1][yi - (1 << k)-1]);
		fout << minn << '\n';
	}
	return 0;
}