Cod sursa(job #424809)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 25 martie 2010 11:00:42
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.69 kb
#include <stdio.h>
#define Nmax 100005
#define Lmax 18

int a[Lmax][Nmax];
int v[Nmax],pow[Nmax];
int n,m,i,j;
int x,y,dif,lg,p;

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

int main(){
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;++i) scanf("%d",&v[i]),a[0][i]=v[i];
	
	pow[1]=0;
	for(i=2;i<=n;++i) 
		pow[i]=pow[i/2]+1;
	
	for(i=1; (1<<i) <= n; ++i)
		for(j=1; j+(1<<i)-1<=n; ++j)
			a[i][j]=min(a[i-1][j], a[i-1][j+(1<<(i-1))]);
	
	for(; m; --m){
		scanf("%d%d",&x,&y);
		lg=y-x+1;
		dif=lg-(1<<pow[lg]);
		printf("%d\n",min(a[pow[lg]][x],a[pow[lg]][x+dif]));
	}
	
	fclose(stdin); fclose(stdout);
	return 0;
}