Cod sursa(job #334795)

Utilizator szabotamasSzabo Tamas szabotamas Data 28 iulie 2009 00:54:57
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <iostream>

using namespace std;

#define NMAX 501
#define NMAXX 2004

long I,J,Q,maxx,maxy,q,w,a,b,i,j,n,m,v[NMAX],t[NMAXX][NMAX];

void build(long k, long beg, long end,long p){
	if (beg==end){
		t[p][k]=v[beg];
		return;
	}
	build(2*k,beg,(beg+end)/2,p);
	build(2*k+1,(beg+end)/2+1,end,p);
	if (t[p][k*2]>=t[p][k*2+1])
		t[p][k]=t[p][k*2];
	else
		t[p][k]=t[p][k*2+1];
}


int maxq (long k, long beg, long end, long p){
	if (a>end || b<beg){
		return -1;
	}
	if (a<=beg && end<=b){
		return t[p][k];
	}
	long x=maxq(2*k,beg,(beg+end)/2,p);
	long y=maxq(2*k+1,(beg+end)/2+1,end,p);
	if (x>=y)
		return x;
	else
		return y;
}



int main(){
	freopen("plantatie.in","r",stdin);
	freopen("plantatie.out","w", stdout);
		scanf("%ld %ld",&n,&m);
		for (j=1; j<=n; j++){
			for (i=1; i<=n; i++){
				scanf("%ld ", &v[i]);
			}
			build(1,1,n,j);
		}
		for (w=1; w<=m; w++){
			scanf ("%ld %ld %ld" ,&I,&J,&Q);
			maxx=-1;
			a=J;
			b=J+Q-1;
			for (i=1; i<=Q; i++){
				maxy=maxq(1,1,n,I+i-1);
				if (maxy>maxx) maxx=maxy;
			}
			printf("%ld\n", maxx);
		}
	return 0;
}