Pagini recente » Cod sursa (job #400861) | Cod sursa (job #1542835) | Cod sursa (job #357451) | Cod sursa (job #1667541) | Cod sursa (job #2538182)
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 100005;
int rmq[20][NMAX];
int v[NMAX];
int pow[20];
int kmax;
int log(int x){
int st=0,dr=kmax,mid;
while(st<dr){
mid=(st+dr)/2;
if(pow[mid]==x)
return mid;
else
if(pow[mid]<x)
st=mid+1;
else
dr=mid-1;
}
return dr;
}
int main(){
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i){
scanf("%d",&v[i]);
rmq[0][i]=v[i];
}
pow[0]=1;
int k;
for(k=1 ;(1<<k) <=n ;++k){
pow[k]=pow[k-1]*2;
for(int i=0 ;i+(1<<k)<=n ;++i)
rmq[k][i]=min(rmq[k-1][i],rmq[k-1][i+(1<<(k-1))]);
//rmq[k][i]=rmq[k-1][i]+rmq[k-1][i+(1<<(k-1))];
}
kmax=k;
int a,b;
for(;m;m--){
scanf("%d%d",&a,&b);
a--,b--; //cause of 0 indexing
// int sum=0;
// for(int k=kmax;k>=0;--k)
// if((1<<k)<=b-a+1){
// sum+=rmq[k][a];
// a+=(1<<k);
// }
int k=log(b-a+1);
printf("%d\n",min(rmq[k][a],rmq[k][b-(1<<k)+1]));
}
return 0;
}