Cod sursa(job #21346)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 23 februarie 2007 12:49:14
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <cstdio>

const int NMAX = 512;
const int LGMAX = 10;

int N, M;
int A[LGMAX][NMAX][NMAX];

void make_RMQ() {
	int i, j, k, stop, top, d;

	for (stop = 1, k = N; k; ++stop, k >>= 1);

	for (k = 1; k <= stop; ++k) {
		top = N - (1 << k) + 1;
		d = 1 << (k - 1);

		for (i = 1; i <= top; ++i) {
			for (j = 1; j <= top; ++j) {
				A[k][i][j] = A[k - 1][i][j];
				A[k][i][j] >?= A[k - 1][i + d][j];
				A[k][i][j] >?= A[k - 1][i][j + d];
				A[k][i][j] >?= A[k - 1][i + d][j + d];

//				printf("%d ", A[k][i][j]);
			}
//			printf("\n");
		}
//		printf("\n");
	}
}

int query(int u, int v, int d) {
	int i, k, ret;

	for (i = 1, k = 0; (i << 1) < d; i <<= 1, ++k);

	ret = A[k][u][v];
	ret >?= A[k][u + d - i][v];
	ret >?= A[k][u][v + d - i];
	ret >?= A[k][u + d - i][v + d - i];

	return ret;
}

int main() {

	FILE *fin = fopen("plantatie.in", "rt");
	FILE *fout = fopen("plantatie.out", "wt");
	int i, j, u, v, d;

	fscanf(fin, " %d %d", &N, &M);

	for (i = 1; i <= N; ++i)
		for (j = 1; j <= N; ++j)
			fscanf(fin, " %d", &A[0][i][j]);
	
	make_RMQ();

	for (i = 0; i < M; ++i) {
		fscanf(fin, " %d %d %d", &u, &v, &d);

		fprintf(fout, "%d\n", query(u, v, d));
	}

	fclose(fin);
	fclose(fout);

	return 0;
}