Cod sursa(job #682414)

Utilizator d.andreiDiaconeasa Andrei d.andrei Data 18 februarie 2012 22:58:28
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <cstdio>

#define file_in "rmq.in"
#define file_out "rmq.out"

int N,M,X,i,a,b,ai[410100],minn;

inline int min(int a, int b) { return a<b?a:b; }

void update(int nod, int st,int dr, int poz, int val){
	
	if (st==dr){
		ai[nod]=val;
		return ;
	}
	
	int mij=(st+dr)/2;
	if (poz<=mij)
		update(2*nod,st,mij,poz,val);
	else
		update(2*nod+1,mij+1,dr,poz,val);
	ai[nod]=min(ai[2*nod],ai[2*nod+1]);
}

void query(int nod, int st, int dr, int a, int b){
	
	if (a<=st && dr<=b){
		minn=min(minn,ai[nod]);
		return ;
	}
	
	int mij=(st+dr)/2;
	
	if (a<=mij)
		query(2*nod,st,mij,a,b);
	if (b>mij)
		query(2*nod+1,mij+1,dr,a,b);
}
		

int main(){
	
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &N, &M);
	for (i=1;i<=N;++i){
		 scanf("%d", &X);
		 update(1,1,N,i,X);
	}
	while(M--){
		scanf("%d %d", &a, &b);
		minn=0x3f3f3f3f;
		query(1,1,N,a,b);
		printf("%d\n",minn);
	}
	
	return 0;
}