Cod sursa(job #633614)

Utilizator eukristianCristian L. eukristian Data 14 noiembrie 2011 10:26:19
Problema Plantatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <cstdio>
#define MAXN 501

int N, M;
int a[10][MAXN][MAXN];
FILE *f, *g;
void read();
void precomp();
int query(int i, int j, int k);

int main()
{
	read();
	precomp();
	
	for (int i = 1 ; i <= M ; ++i)
	{
		int i, j, k;
		fscanf(f, "%d %d %d", &i, &j, &k);
		fprintf(g, "%d\n", query(i, j, k)); 
	}
	
	return 0;
}

void read()
{
	f = fopen("plantatie.in", "r");
	g = fopen("planataie.out", "w");
	
	fscanf(f, "%d %d", &N, &M);
	for (int i = 1;  i <= N ; ++i)
		for (int j = 1 ; j <= N ; ++j)
			fscanf(f, "%d", &a[0][i][j]);
}

void precomp()
{
	for (int k = 1 ; (1 << k) <= N ; ++k)
		for (int i = 1 ; i <= N - (1 << k) + 1 ; ++i)
			for (int j = 1 ; j <= N - (1 << k) + 1;  ++j)
			{
				a[k][i][j] = a[k - 1][i][j];
				if (a[k][i][j] < a[k - 1][i + (1 << (k - 1))][j])
					a[k][i][j] = a[k - 1][i + (1 << (k - 1))][j];
				if (a[k][i][j] < a[k - 1][i][j + (1 << (k - 1))])
					a[k][i][j] = a[k - 1][i][j + (1 << (k - 1))];
				if (a[k][i][j] < a[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))])
					a[k][i][j] = a[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))];
			}
}

int query(int i, int j, int k)
{
	int p = 10, result;
	while ((1 << p) > k) p--;
	
	result = a[p][i][j];
	if (result < a[p][i + k - (1 << p)][j])
		result = a[p][i + k - (1 << p)][j];
	if (result < a[p][i][j + k - (1 << p)])
		result = a[p][i][j + k - (1 << p)];
	if (result < a[p][i + k - (1 << p)][j + k - (1 << p)])
		result = a[p][i + k - (1 << p)][j + k - (1 << p)];
	return result;
}