Cod sursa(job #19424)

Utilizator MariusMarius Stroe Marius Data 19 februarie 2007 15:24:47
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>
using namespace std;

const char iname[] = "plantatie.in";
const char oname[] = "plantatie.out";

#define MAX_N  505

#define MAX_LG 10

int A[MAX_N][MAX_N][MAX_LG];

int N, M;


int main(void)
{
	freopen(iname, "r", stdin);
	int i;
	int j;
	int k;
	int r;
	int P[MAX_N] = {0}, ret;
	for (scanf("%d %d", & N, & M), i = 1; i <= N; ++ i)
		for (j = 1; j <= N; ++ j)
			scanf("%d", A[i][j]);
	for (k = 1; k <= MAX_LG; ++ k) {
		for (i = 1; i <= N; ++ i)
			for (j = 1; j <= N; ++ j) {
				int add = 1 << (k - 1);
				if ((i + add > N) || (j + add > N))
					continue ;
				int ret = A[i][j][k - 1];
				if (ret < A[i + add][j][k - 1])
					ret = A[i + add][j][k - 1];
				if (ret < A[i][j + add][k - 1])
					ret = A[i][j + add][k - 1];
				if (ret < A[i + add][j + add][k - 1])
					ret = A[i + add][j + add][k - 1];
				A[i][j][k] = ret;
			}
	}
	for (i = 0; 1 << i <= N; ++ i)
		P[1 << i] = i;
	for (i = 3; i <= N; ++ i) {
		if (P[i] == 0)
			P[i] = P[i - 1];
	}
	freopen(oname, "w", stdout);

	for (; M > 0; -- M) {
		scanf("%d %d %d", & i, & j, & k);
		r = P[k];
		ret = A[i][j][r];
		if (ret < A[i + k - (1 << r)][j][r])
			ret = A[i + k - (1 << r)][j][r];
		if (ret < A[i][j + k - (1 << r)][r])
			ret = A[i][j + k - (1 << r)][r];
		if (ret < A[i + k - (1 << r)][j + k - (1 << r)][r])
			ret = A[i + k - (1 << r)][j + k - (1 << r)][r];
		printf("%d\n", ret);
	}

	return 0;
}