Cod sursa(job #484276)

Utilizator darrenRares Buhai darren Data 13 septembrie 2010 12:31:21
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>
#include <algorithm>

using namespace std;

int n, m;
int rmq[9][502][502];
int lg[502];

int main()
{
	ifstream fin("plantatie.in");
	ofstream fout("plantatie.out");

	fin >> n >> m;

	for (int i = 2; i <= n; ++i)
		lg[i] = lg[i >> 1] + 1;
	for (int i = 1; i <= n; ++i)
		for (int j = 1; j <= n; ++j)
			fin >> rmq[0][i][j];

	for (int k = 1; k <= lg[n]; ++k)
		for (int i = 1; i <= n; ++i)
			for (int j = 1; j <= n; ++j)
			{
				rmq[k][i][j] = rmq[k - 1][i][j];
				if (i + (1 << (k - 1)) <= n)
					rmq[k][i][j] = max(rmq[k][i][j], rmq[k - 1][i + (1 << (k - 1))][j]);
				if (j + (1 << (k - 1)) <= n)
					rmq[k][i][j] = max(rmq[k][i][j], rmq[k - 1][i][j + (1 << (k - 1))]);
				if (i + (1 << (k - 1)) <= n && j + (1 << (k - 1)) <= n)
					rmq[k][i][j] = max(rmq[k][i][j], rmq[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))]);
			}

	for (int i = 1, x, y, s; i <= m; ++i)
	{
		fin >> x >> y >> s;

		int k = lg[s];

		int res = 0;
		res = max(res, rmq[k][x][y]);
		res = max(res, rmq[k][x + s - (1 << k)][y]);
		res = max(res, rmq[k][x][y + s - (1 << k)]);
		res = max(res, rmq[k][x + s - (1 << k)][y + s  - (1 << k)]);

		fout << res << '\n';
	}

	fin.close();
	fout.close();
}