Cod sursa(job #18230)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 18 februarie 2007 10:51:47
Problema Plantatie Scor 10
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasa a 10-a Marime 1.76 kb
#include <cstdio>
#define FIN "plantatie.in"
#define FOUT "plantatie.out"
#define MAX 501

long A[MAX][MAX];
long T[4*MAX*MAX];
long N, M, max=0;

void constr(long i, long x1, long y1, long x2, long y2) {
	if ( i>max ) 
		max = i;
	if (x1==x2 && y1==y2) {
		T[i] = A[x1][y1]; return;
	}
	
	long mx = (x1+x2)/2;
	long my = (y1+y2)/2;

	if ( x1==x2 ) {
		constr(4*i+1, x1,y1,x1,my);
		constr(4*i+2, x1,my+1,x2,y2);
		T[4*i+3] = T[4*i+1]; 
		T[4*i+4] = T[4*i+2];
		return;
	}
	if ( y1==y2 ) {
		constr(4*i+1, x1,y1,mx,y1);
		constr(4*i+3, mx+1,y1,x2,y1);
		T[4*i+2] = T[4*i+1];
		T[4*i+4] = T[4*i+3];
		return;
	}

	constr(4*i+1, x1,y1,mx,my);
	constr(4*i+2, x1,my+1,mx,y2);
	constr(4*i+3, mx+1,y1,x2,my);
	constr(4*i+4, mx+1,my+1,x2,y2);


	T[i] = 0; long j;
	for (j=1; j<=4; ++j)
		if (T[i]<T[4*i+j])
			T[i] = T[4*i+j];
}

long px1,px2,py1,py2, V[4];

long divide(long i, long x1,long y1, long x2,long y2) {
	if ( px1<=x1 && py1<=y1 && x2<=px2 && y2<=py2 )
		return T[i];
	long mx = (x1+x2) / 2;
	long my = (y1+y2) / 2;

	long max=0; for(long j=0; j<4; ++j) V[j]=0;
	if ( mx>=px1 ) {
		if ( my>=py1 )
			V[0] = divide(4*i+1, x1,y1, mx, my);
		if ( my<py2 )
			V[1] = divide(4*i+2, x1,my+1, mx, y2);
	}
	if ( mx<px2 ) {
		if (my>=py1)
			V[2] = divide(4*i+3, mx+1, y1, x2, my);
		if (my<py2)
			V[3] = divide(4*i+4, mx+1,my+1,x2,y2);
	}
	for (long j=0; j<4; ++j)
		max=(max<V[j]) ? V[j] : max;
	return max;
}

int main() {
	long i,j, x,y,z;

	freopen(FIN, "r", stdin);
	freopen(FOUT, "w", stdout);
	
	scanf("%ld %ld", &N, &M);
	for (i=1; i<=N; ++i)
		for (j=1; j<=N; ++j)
			scanf("%ld", A[i]+j);

	constr(0,1,1,N,N);
	
	for (i=0; i<M; ++i) {
		scanf("%ld %ld %ld", &x, &y, &z);
		px1=x;
		py1=y;
		px2=x+z-1;
		py2=y+z-1;
		printf("%ld\n", divide(0,1,1,N,N));
	}
	fclose(stdin);fclose(stdout);
	return 0;
}