Cod sursa(job #794727)

Utilizator mihaiSimuSimu Mihai mihaiSimu Data 6 octombrie 2012 21:54:25
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <stdio.h>

int min(int a,int b){return a<b?a:b;}
int a[100005],n,m1;
int m[100005][18];
int log2[100005];

void preprocess(){
	log2[1]=0;for(int i=2;i<=n;i++) log2[i]=log2[i/2]+1;

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

int rmq(int i,int j){
	int k=log2[j-i+1];
	return min(m[i][k],m[j-(1<<k)+1][k]);
}

int main(){
	int x,y;
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	
	scanf("%d",&n);
	scanf("%d",&m1);
	
	for(int i=0;i<n;i++) scanf("%d",&a[i]);
	preprocess();
	
	bool first=true;
	for(int i=0;i<m1;i++){scanf("%d",&x);scanf("%d",&y);
		if(!first) printf("\n");
		first=false;
		printf("%d",rmq(x-1,y-1));
	}
	return 0;
}