Cod sursa(job #67018)

Utilizator peanutzAndrei Homorodean peanutz Data 22 iunie 2007 11:23:19
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <stdio.h>
#define NMAX 502

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

void read()
{
	int i, j;
	scanf("%d %d", &n, &m);
	for(i = 1; i <= n; ++i)
		for(j = 1; j <= n; ++j)
			scanf("%d", &a[i][j][0]);

}
void solve()
{
	int i, j, k, aux;
	for(k = 1; k <= 10; ++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)
	{
		scanf("%d %d %d", &x, &y, &z);
		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];

		printf("%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()
{
	freopen("plantatie.in", "r", stdin);
	freopen("plantatie.out", "w", stdout);

	read();

	solve();

	//print();
        query();

	fclose(stdin);
	fclose(stdout);

	return 0;
}