Cod sursa(job #18628)

Utilizator plastikDan George Filimon plastik Data 18 februarie 2007 12:49:38
Problema Plantatie Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasa a 10-a Marime 1.17 kb
#include <cstdio>

const int MAX_N = 512;
int N, M;
int A[MAX_N][MAX_N];
int C[MAX_N][MAX_N][MAX_N];

inline int max(int a, int b, int c, int d) {
	int ret = a;
	if (b > ret) {
		ret = b;
	}
	if (c > ret) {
		ret = c;
	}
	if (d > ret) {
		ret = d;
	}
	return ret;
}

int main(void) {
	FILE *in = fopen("plantatie.in", "r"),
		*out = fopen("plantatie.out", "w");
	fscanf(in, "%d %d", &N, &M);
	int i, j;
	for (i = 0; i < N; ++ i) {
		for (j = 0; j < N; ++ j) {
			fscanf(in, "%d", &A[i][j]);
		}
	}
	
	for (i = 0; i < N; ++ i) {
		for (j = 0; j < N; ++ j) {
			C[i][j][1] = A[i][j];
		}
	}
	int k;
	for (k = 2; k <= N; ++ k) {
		for (i = 0; i < N - k + 1; ++ i) {
			for (j = 0; j < N - k  + 1; ++ j) {
				if (k % 2 == 1) {
					C[i][j][k] = max(C[i][j][k / 2 + 1], C[i + k / 2][j][k / 2 + 1], C[i][j + k / 2][k / 2 + 1],
									C[i + k / 2][j + k / 2][k / 2 + 1]);
				} else {
					C[i][j][k] = max(C[i][j][k / 2], C[i + k / 2][j][k / 2], C[i][j + k / 2][k / 2],
									C[i + k / 2][j + k / 2][k / 2]);
				}
			}
		}
	}
	
	int t, nc, is, js;
	for (t = 0; t < M; ++ t) {
		fscanf(in, "%d %d %d", &is, &js, &nc);
		is --;
		js --;
		fprintf(out, "%d\n", C[is][js][nc]);
	}
		
	return 0;
}