Cod sursa(job #723868)

Utilizator cotofanaCotofana Cristian cotofana Data 25 martie 2012 23:33:05
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream>

using namespace std;

#define NMAX 500
#define LOGNMAX 10

long N, M, m[NMAX][NMAX], rmq[NMAX][NMAX][LOGNMAX], p[LOGNMAX];
ifstream in("plantatie.in");
ofstream out("plantatie.out");

void read()
{
	in >> N >> M;
	for (int i = 0; i < N; ++i)
		for (int j = 0; j < N; ++j)
			in >> m[i][j];
}

long maxim(const long A, const long B)
{
	return A > B ? A : B; 
}

long maxim(const long A, const long B, const long C, const long D)
{
	return maxim(maxim(A, B), maxim(C, D));
}



void calc()
{
	p[0] = 1;
	for (int i = 1; i < LOGNMAX; ++i)
		p[i] = 2 * p[i - 1];
	for (int i = 0; i < N; ++i)
		for (int j = 0; j < N; ++j)
			rmq[i][j][0] = m[i][j];
	for (int k = 1; p[k] <= N; ++k)
		for (int i = 0; i < N - p[k] + 1; ++i)
			for (int j = 0; j < N - p[k] + 1; ++j)
				rmq[i][j][k] = maxim(rmq[i][j][k - 1], rmq[i + p[k-1]][j][k - 1], rmq[i][j + p[k-1]][k - 1],
					rmq[i + p[k-1]][j + p[k-1]][k - 1]);
}

int search(int val)
{
	for (int i = 1; i < LOGNMAX; ++i)
		if (p[i] > val)
			return i - 1;
}

void query()
{
	for (int i = 0; i < M; ++i)
	{
		int x, y, l, ind, rez;
		in >> x >> y >> l;
		--x;
		--y;
		ind = search(l);
		rez = maxim(rmq[x][y][ind], rmq[x + l - p[ind]][y][ind], rmq[x][y + l - p[ind]][ind],
			rmq[x + l - p[ind]][y + l - p[ind]][ind]);
		out << rez << endl;
	}
}

int main()
{
	read();
	calc();
	query();

	in.close();
	out.close();

	return 0;
}