Cod sursa(job #110219)

Utilizator plastikDan George Filimon plastik Data 25 noiembrie 2007 21:22:03
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <cstdio>

const int MAX_N = 512;
const int LOG_N = 10;

int n, A[MAX_N][MAX_N], max[MAX_N][MAX_N][LOG_N];
int P2[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024};

int main() {
	freopen("plantatie.in", "r", stdin);
	freopen("plantatie.out", "w", stdout);

	int t;
	scanf("%d %d", &n, &t);

	int i, j, k, ln = 10;

	for (i = 0; i < n; ++ i)
		for (j = 0; j < n; ++ j) {
			scanf("%d", &A[i][j]);
			max[i][j][0] = A[i][j];
		}

	/*for (i = 0; i < n; ++ i) {
		for (j = 0; j < n; ++ j)
			printf("%d ", A[i][j]);
		printf("\n");
	}*/
	for (k = 1; k < ln; ++ k)
		for (i = 0; i < n; ++ i)
			for (j = 0; j < n; ++ j) {
				max[i][j][k] = max[i][j][k - 1];

				if (i + P2[k - 1] < n &&  max[i][j][k] < max[i + P2[k - 1]][j][k - 1])
					max[i][j][k] = max[i + P2[k - 1]][j][k - 1];

				if (j + P2[k - 1] < n && max[i][j][k] < max[i][j + P2[k - 1]][k - 1])
					max[i][j][k] = max[i][j + P2[k - 1]][k - 1];

				if (i + P2[k - 1] < n && j + P2[k - 1] < n && max[i][j][k] < max[i + P2[k - 1]][j + P2[k - 1]][k - 1])
					max[i][j][k] = max[i + P2[k - 1]][j + P2[k - 1]][k - 1];
			}

	/*for (k = 0; k < ln; ++ k) {
		printf("%d\n", k);
		for (i = 0; i < n; ++ i) {
			for (j = 0; j < n; ++ j)
				printf("%d ", max[i][j][k]);
			printf("\n");
		}
	}*/

	int m;
	for (; t > 0; -- t) {
		scanf("%d %d %d", &i, &j, &k);
		-- i, -- j;
		for (ln = 0; P2[ln] <= k && ln < LOG_N; ++ ln)
			;
		-- ln;

		m = max[i][j][ln];

		if (m < max[i + k - P2[ln]][j][ln])
			m = max[i + k - P2[ln]][j][ln];

		if (m < max[i][j + k - P2[ln]][ln])
			m = max[i][j + k - P2[ln]][ln];

		if (m < max[i + k - P2[ln]][j + k - P2[ln]][ln])
			m = max[i + k - P2[ln]][j + k - P2[ln]][ln];

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

	return 0;
}