Cod sursa(job #400548)

Utilizator BaduBadu Badu Badu Data 21 februarie 2010 16:43:17
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.66 kb
#include<cstdio>
#define max 100005

int M[18][max];
int V[max],n,m,Log[max];

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

int main(){
	
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	
	int i,j;
	
	scanf("%d %d",&n,&m);
	for(i=1;i<=n;i++) scanf("%d",&V[i]);
	for(i=1;i<=n;i++) M[0][i] = V[i];	

	for( i=1; (1<<i) <= n; i++)
		for(j=1;j <= n - ( 1<<i ) + 1 ; j++){
			int  l = 1<<(i-1);
			M[i][j] = min( M[i-1][j],M[i-1][j+l] );
		}
	
	Log[1]=0;
	for(i=2;i<=n;i++)Log[i] = 1+Log[i/2];
	
	while( m-- ){
		scanf("%d %d",&i,&j);
		int k = Log[j-i+1];
		printf("%d\n",min( M[k][i], M[k][j - (1<<k)+1]));
	}
		
	return 0;
}