Cod sursa(job #1355811)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 22 februarie 2015 23:12:06
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <fstream>
#define NMax 505
using namespace std;
ifstream f("plantatie.in");
ofstream g("plantatie.out");
int n, m, rmq[NMax][NMax][11], lg, x, y, l, plog[NMax];
int getmax(int a, int b)
{
	if (a > b)
		return a;
	return b;
}
int main()
{

	f >> n >> m;
	plog[1] = 0;
	plog[2] = 1;
	for (int i = 3; i <= n; i++)
		plog[i] = plog[i / 2] + 1;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			f >> rmq[i][j][0];
	lg = plog[n];
	for (int k = 1; k <= lg; k++) {
		for (int i = 1; i <= n - (1 << (k - 1)); i++) {
			for (int j = 1; j <= n - (1 << (k - 1)); j++) {
				rmq[i][j][k] = getmax(rmq[i][j][k - 1], 
								getmax(rmq[i + (1 << (k - 1))][j][k - 1], 
								 getmax(rmq[i][j + (1 << (k - 1))][k - 1], 
								        rmq[i + (1 << (k - 1))][j + (1 << (k - 1))][k - 1])));
			}
		}
	}
	for (int i = 1; i <= m; i++) {
		f >> x >> y >> l;
		lg = plog[l];
		g << getmax(rmq[x][y][lg],
			  getmax(rmq[x + l - (1 << lg)][y][lg],
			   getmax(rmq[x][y + l - (1 << lg)][lg],
				      rmq[x + l - (1 << lg)][y + l - (1 << lg)][lg]))) << "\n";
	}
}