Cod sursa(job #448107)

Utilizator ooctavTuchila Octavian ooctav Data 2 mai 2010 18:29:47
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <cstdio>
#include <algorithm>
using namespace std;

const int NMAX = 510;
const int LMAX = 10;

int N, M;
int lg[NMAX];
int R[LMAX][NMAX][NMAX];

void write(int k)
{
	for(int i = 1 ; i <= N ; i++)
	{
		for(int j = 1 ; j <= N ; j++)
			printf("%d ", R[k][i][j]);
		printf("\n");
	}
	printf("\n\n\n");
}

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

void citire()
{
	scanf("%d%d", &N, &M);
	for(int i = 1 ; i <= N ; i++)
		for(int j = 1 ; j <= N ; j++)
			scanf("%d", &R[0][i][j]);

	//write(0);
}

void log()
{
	lg[1] = 0;
	for(int i = 2 ; i <= N ; i++)
		lg[i] = lg[i / 2] + 1;
}

void rmq()
{
	for(int k = 1 ; (1<<k) <= N ; k++)
	{
		for(int i = 1 ; i + (1<<k) - 1 <= N ; i++)
			for(int j = 1 ; j + (1<<k) - 1 <= N ; j++)
				R[k][i][j] = max(R[k - 1][i][j], R[k - 1][i + (1<<(k - 1))][j], R[k - 1][i][j + (1<<(k - 1))], R[k - 1][i + (1<<(k - 1))][j + (1<<(k - 1))]);
		//write(k);
	}

}

void apeluri()
{
	int x, y, z;
	int p;
	for(int i = 1 ; i <= M ; i++)
	{
		scanf("%d%d%d", &x, &y, &z);
		p = lg[z];
		printf("%d\n", max(R[p][x][y], R[p][x + z - (1<<p)][y], R[p][x][y + z - (1<<p)], R[p][x + z - (1<<p)][y + z - (1<<p)]));
	}
}

int main()
{
	freopen("plantatie.in","r",stdin);
	freopen("plantatie.out","w",stdout);
	citire();
	log();
	rmq();
	apeluri();
	return 0;
}