Cod sursa(job #384670)

Utilizator raduzerRadu Zernoveanu raduzer Data 20 ianuarie 2010 18:11:24
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <cstdio>

const int MAX_N = 770;

int n, m;
int d[MAX_N][MAX_N][10];

inline int max(int a, int b) { return (a > b) ? a : b; }

int main()
{
	int i, j, pow, x, y, z, k;
	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", &d[i][j][0]);

	for (pow = 0;; ++pow)
		if (1 << (pow + 1) > n)
			break;

	for (k = 1; k <= pow; ++k)
	{
		int v = 1 << (k - 1);

		for (i = 1; i <= n; ++i)
			for (j = 1; j <= n; ++j)
				if (j + (1 << k) - 1 <= n && i + (1 << k) - 1 <= n)
				{
					int mx = max(d[i][j][k - 1], d[i + v][j][k - 1]);
					mx = max(mx, d[i][j + v][k - 1]);
					mx = max(mx, d[i + v][j + v][k - 1]);

					d[i][j][k] = max(mx, d[i][j][k]);
				}
	}

	for (i = 1; i <= m; ++i)
	{
		scanf("%d %d %d", &x, &y, &z);

		for (pow = 0;; ++pow)
			if ((1 << (pow + 1)) >= z)
				break;

		int v = 1 << pow;
		int mx = max(d[x][y][pow], d[x][y + z - v][pow]);
		mx = max(mx, d[x + z - v][y][pow]);
		mx = max(mx, d[x + z - v][y + z - v][pow]);

		printf("%d\n", mx);
	}
}