Cod sursa(job #414308)

Utilizator iulia609fara nume iulia609 Data 9 martie 2010 22:11:28
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<stdio.h>
using namespace std;
#define NMAX 505
#define MMAX 75005

int C[NMAX][NMAX][15], N, M;

int putere(int a)
{
	int k = 0;
	for(; 1<<(k + 1) <= a; ++k);
	return k;
}

int max(int a, int b, int c, int d)
{
	if(a > b); else a = b;
	if(a > c); else a = c;
	if(a > d); else a = d;
	return a;
}

int main()
{ int i, j, t, lung, x, y, l, val;
	
	
	freopen("plantatie.in", "r", stdin);
	freopen("plantatie.out", "w", stdout);
	
	scanf("%d %d", &N, &M);
	for(i = 1; i <= N; i++)
		for(j = 1; j <= N; j++)
		{
			scanf("%d", &C[i][j][0]);
		}
		
	lung = putere(N);
	
	for(t = 1; t <= lung; t++)
	{
		val = 1<<(t-1);
		for(i = 1; i <= N; i++)
			for(j = 1; j <= N; j++)
				if(i + (1<<t) -1 <= N && j + (1<<t) -1 <= N)
					C[i][j][t] = max(C[i][j][t-1], C[i+val][j][t-1], C[i][j+val][t-1], C[i+val][j+val][t-1]);
	}
		
	
	int rez, put;
	for(i = 1; i <= M; i++)
	{
		scanf("%d %d %d", &x, &y, &l);
		put = putere(l); val = 1 << put;
		
		rez = max(C[x][y][put], C[x - val + l][y][put], C[x][y - val + l][put], C[x - val + l][y - val + l][put]); 
		
		printf("%d\n", rez);
	}
	return 0;
}