Cod sursa(job #304120)

Utilizator TyberFMI Dogan Adrian Ioan Lucian Tyber Data 10 aprilie 2009 23:19:56
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.67 kb
#include<stdio.h>
#include<vector>
using namespace std;
#define nmax 100002
#define lmax 18
long long a[lmax][nmax],n,m,l[nmax],b[nmax];
int main(){
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	long long i,j,l1;
	scanf("%lld %lld",&n,&m);
	for(i=1;i<=n;i++)
		scanf("%lld",&b[i]);
	l[1]=0;
	for(i=2;i<=n;i++)
		l[i]=l[i/2]+1;
	for(i=1;i<=n;i++)
		a[0][i]=b[i];
	for(i=1;(1<<i)<=n;i++)
		for(j=1;j<=n-(1<<i)+1;j++){
			l1=1<<(i-1);
			a[i][j]=min(a[i-1][j],a[i-1][j+l1]);
		}
	long long x,y,d,s;
	for(i=1;i<=m;i++){
		scanf("%lld %lld",&x,&y);
		d=y-x+1;
		l1=l[d];
		s=d-(1<<l1);
		printf("%lld\n",min(a[l1][x],a[l1][x+s]));
	}
	return 0;
}