Cod sursa(job #334495)

Utilizator szabotamasSzabo Tamas szabotamas Data 27 iulie 2009 02:54:58
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <iostream>

using namespace std;
#define nr 100002
#define NMAX 100002
#define MMAX 1000002
long X,i,n,m,I,J,a[NMAX],t[MMAX];

void build(long k, long beg, long end){
	if(beg==end){
		t[k]=a[beg];
		return;
	}
	else {
		build(k*2,beg,(beg+end)/2);
		build(k*2+1,(beg+end)/2+1,end);
	}
	if(t[k*2]<=t[k*2+1])
		t[k]=t[k*2];
	else
		t[k]=t[k*2+1];
}
	
long minim(long k, long beg, long end){
	long x,y;
	if (J<beg || I>end)
		return nr;
	if (I<=beg && J>=end)
		return t[k];
	x=minim(k*2,beg,(beg+end)/2);
	y=minim(k*2+1,(beg+end)/2+1,end);
	if(x<=y)
		return x;
	else
		return y;
}

int main(){
	
	freopen("rmq.in", "r", stdin);
		scanf("%ld %ld", &n,&m);
		for (i=1; i<=n; i++){
			scanf("%ld ",&a[i]);
		}
		//for (i=1; i<=2*n; i++){
		//	t[i]=nr;
		//}
		build(1,1,n);
	freopen("rmq.out", "w", stdout);
		for (i=1; i<=m; i++){
			scanf("%ld %ld",&I,&J);
			printf("%ld\n",minim(1,1,n));
		}
	fclose(stdout);
	fclose(stdin);
	return 0;
}