Cod sursa(job #19186)

Utilizator wefgefAndrei Grigorean wefgef Data 18 februarie 2007 20:55:47
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define Nmax 512

int rmq[Nmax][Nmax][10];
int n, m;
int level[Nmax];

int main()
{
	freopen("plantatie.in", "r", stdin);
	freopen("plantatie.out", "w", stdout);
	
	int i, j, k;
	
	scanf("%d %d", &n, &m);
	for (i = 1; i <= n; ++i)
	for (j = 1; j <= n; ++j)
		scanf("%d", &rmq[i][j][0]);
		
	for (k = 1; (1 << (k-1)) < n; ++k)
	for (i = n - (1 << (k-1)); i; --i)
	for (j = n - (1 << (k-1)); j; --j)
	{
		rmq[i][j][k] = max(rmq[i][j][k], rmq[i][j][k-1]);
		rmq[i][j][k] = max(rmq[i][j][k], rmq[i+(1 << (k-1))][j][k-1]);
		rmq[i][j][k] = max(rmq[i][j][k], rmq[i][j+(1<<(k-1))][k-1]);
		rmq[i][j][k] = max(rmq[i][j][k], rmq[i+(1 << (k-1))][j+(1<<(k-1))][k-1]);
	}
	
	int next = 2, lev = 0, rez;
	for (i = 2; i <= n; ++i)
	{
		level[i] = lev;
		if (i == next)
		{
			next <<= 1;
			++lev;
		}
	}
	
	for (; m; --m)
	{
		scanf("%d %d %d", &i, &j, &k);
		if (k == 1) printf("%d\n", rmq[i][j][0]);
		else
		{
			rez = rmq[i][j][level[k]];
			rez = max(rez, rmq[i][j+k - (1 << level[k])][level[k]]);
			rez = max(rez, rmq[i+k - (1 << level[k])][j][level[k]]);
			rez = max(rez, rmq[i+k - (1 << level[k])][j+k - (1 << level[k])][level[k]]);
			printf("%d\n", rez);
		}
	}
	
	return 0;
}