Cod sursa(job #110606)

Utilizator oumbraPaul Filimoon oumbra Data 26 noiembrie 2007 23:59:30
Problema Plantatie Scor 50
Compilator c Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <stdio.h>
#define NMAX 502

int a[NMAX][NMAX][12];
int n, m;
int tmpx;

FILE * fi, *fo;

void read()
{
	int i, j;
	fscanf(fi, "%d %d ", &n, &m);
	for(i = 1; i <= n; ++i)
		for(j = 1; j <= n; ++j)
		{
			fscanf(fi, "%d ", &tmpx);
			a[i][j][0] = tmpx;
			fprintf(stderr, "%d ", tmpx);
		}

}
void solve()
{
	int i, j, k, aux;
	for(k = 1; k <= 9; ++k)
		for(i = 1, aux = (1<<(k-1)); i <= n; ++i)
			for(j = 1; j <= n; ++j)
			{
				a[i][j][k] = a[i][j][k-1];
				if(i + aux <= n && a[i][j][k] < a[i + aux][j][k-1])
					a[i][j][k] = a[i + aux][j][k-1];
				if(j + aux <= n && a[i][j][k] < a[i][j + aux][k-1])
					a[i][j][k] = a[i][j + aux][k-1];
				if(j + aux <= n && i + aux <= n && a[i][j][k] < a[i + aux][j + aux][k-1])
					a[i][j][k] = a[i + aux][j + aux][k-1];
			}
}

void query()
{
	int max, i, x, y, z, p, p2;
	int pow[NMAX], pow2[NMAX];

	for(pow[0] = pow[1] = 1, pow2[1] = pow2[0] = 0, i = 2; i < NMAX; ++i)
		if(pow[i-1]*2 <= i)
			pow[i] = pow[i-1]*2, pow2[i] = 1+pow2[i-1];
		else
			pow[i] = pow[i-1], pow2[i] = pow2[i-1];

	for(i = 0; i < m; ++i)
	{
		fscanf(fi, "%d ", &tmpx);
		x = tmpx;
		fprintf(stderr, "%d ", tmpx);

		fscanf(fi, "%d ", &tmpx);
		y = tmpx;
		fprintf(stderr, "%d ", tmpx);

		fscanf(fi, "%d ", &tmpx);
		z = tmpx;
		fprintf(stderr, "%d ", tmpx);

		p2 = pow[z];
		p =  pow2[z];

		max = a[x][y][p];

		if(x+z-p2 > 0 && x+z-p2 <= n && a[x+z-p2][y][p] > max)
			max = a[x+z-p2][y][p];

		if(y+z-p2 > 0 && y+z-p2 <= n && a[x][y+z-p2][p] > max)
			max = a[x][y+z-p2][p];

		if(x+z-p2 > 0 && x+z-p2 <= n && y+z-p2 > 0 && y+z-p2 <= n && a[x+z-p2][y+z-p2][p] > max)
			max = a[x+z-p2][y+z-p2][p];

		fprintf(fo, "%d\n",  max);
	}
}

void print()
{
	int i, j, k;
	for(k = 0; k <= 5; ++k)
	{
		printf("pentru k = %d\n", k);
		for(i = 1; i <= n; ++i)
		{
			for(j = 1; j <= n; ++j)
				printf("%d ", a[i][j][k]);
			printf("\n");
                }
		printf("\n");
	}
}

int main()
{
	int i, j, k;

//	freopen("plantatie.in", "r", stdin);
//	freopen("plantatie.out", "w", stdout);

	fi = fopen("plantatie.in", "r");
	fo = fopen("plantatie.out", "w");

	read();

	solve();

//	print();
	query();

	return 0;
}