Cod sursa(job #178748)

Utilizator stinkyStinky si Grasa stinky Data 15 aprilie 2008 07:47:04
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include<stdio.h>
const int N=100017;
const int M=1000017;
const int LOG=17;
int v[N],a[N][LOG],log[N],n,m;

void calcul_log(){
	int x=1,y=0;
	for(int i=1 ; i<=n ; ++i)
		if(i<(x<<1))
			log[i]=y;
		else{
			x<<=1;
			log[i]=++y;
		}
}

void citire_vector(){
	scanf("%d%d" , &n , &m);
	for(int i=1 ; i<=n ; ++i)
		scanf("%d", &v[i]);
}

inline int min(int x,int y){
	if(x<y)
		return x;
	return y;
}

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

void scrie(){
	int x,y,lung;
	for(int i=1 ; i<=m ; ++i){
		scanf("%d%d",&x,&y);
		lung=log[y-x+1];
		printf("%d\n",min(a[x][lung],a[y-(1<<lung)+1][lung]));
	}
}

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