Cod sursa(job #204461)

Utilizator rapidu36Victor Manz rapidu36 Data 24 august 2008 13:00:58
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.74 kb
#include<stdio.h>
#define N 100100
#define L 20

int a[N][L],n,m,v[N];

inline int minim(int x,int y){
	return x<y ? x : y;
}

int doi(int x){
	int p=1,nr=0;
	while(p<=x){
		p<<=1;
		++nr;
	}
	return nr-1;
}

int rez(int x,int y){
	int p=doi(y-x+1);
	return minim(a[x][p],a[y-(1<<p)+1][p]);
}

void init(){
	int i,j;
	for(i=n ; i ; --i){
		a[i][0]=v[i];
		for(j=1 ; i+(1<<j)-1<=n ; ++j)
			a[i][j]=minim(a[i][j-1],a[i+(1<<(j-1))][j-1]);
	}
}

void calcul(){
	int x,y;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
		scanf("%d",&v[i]);
	init();
	while(m--){
		scanf("%d%d",&x,&y);
		printf("%d\n",rez(x,y));
	}
}

int main(){
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	calcul();
	return 0;
}