Cod sursa(job #20282)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 20 februarie 2007 22:24:35
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <cstdio>
#define FIN "plantatie.in"
#define FOUT "plantatie.out"
#define MAX 501

long N, M;
long v[MAX][MAX][10];

inline long max(long a1, long a2, long a3, long a4) {
	long m = a1;
	if ( m<a2 ) 
		m = a2;
	if ( m<a3 ) 
		m = a3;
	if ( m<a4 ) 
		m = a4;
	return m;
}

void precalc() {
	long i,j,k, p;
	for (k=1; (1<<k)<=N; ++k) {
		p = (1<<(k-1));
		for (i=1; i+(p<<1)-1<=N; ++i)
			for (j=1; j+(p<<1)-1<=N; ++j)
				v[i][j][k] = max(v[i][j][k-1], v[i+p][j][k-1], v[i][j+p][k-1], v[i+p][j+p][k-1]);
	}
}

int main() {
	freopen(FIN, "r", stdin); freopen(FOUT, "w", stdout);

	scanf("%ld %ld", &N, &M);
	for (long i=1; i<=N; ++i)
		for (long j=1; j<=N; ++j)
			scanf("%ld", v[i][j]);

	precalc();
	while (M--) {
		long x,y,z, i, p;
		scanf("%ld %ld %ld", &x, &y, &z);
		for (i=0; (1<<(i+1)) <= z; ++i);
		p = (1<<i);
		printf("%ld\n", max(v[x][y][i], v[x+z-p][y][i], v[x][y+z-p][i], v[x+z-p][y+z-p][i]));
	}

	fclose(stdin); fclose(stdout);
	return 0;
}