Cod sursa(job #384675)

Utilizator raduzerRadu Zernoveanu raduzer Data 20 ianuarie 2010 18:16:32
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 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; }

inline int max(int a, int b, int c, int d)
{
	int mx = (a > b) ? a : b;
	mx = (mx > c) ? mx : c;
	mx = (mx > d) ? mx : d;

	return mx;
}

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; 1 << (pow + 1) <= n; ++pow);

	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)
					d[i][j][k] = max(d[i][j][k - 1], d[i + v][j][k - 1], d[i][j + v][k - 1], d[i + v][j + v][k - 1]);
	}

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

		for (pow = 0; 1 << (pow + 1) < z; ++pow);

		int v = 1 << pow;
		printf("%d\n", max(d[x][y][pow], d[x][y + z - v][pow], d[x + z - v][y][pow], d[x + z - v][y + z - v][pow]));
	}
}