Pagini recente » Cod sursa (job #829023) | Cod sursa (job #2750013) | Cod sursa (job #525621) | Cod sursa (job #1600504) | Cod sursa (job #2425077)
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 100002;
const int LOGMAX = 20;
long int rmq[LOGMAX][NMAX];
long int v[NMAX];
long int logg[NMAX];
void setup_rmq(int n){
logg[1]=0;
for(int i=2;i<=n;++i)
logg[i]=logg[i/2]+1;
for(int i=1;i<=n;++i)
rmq[0][i]=v[i];
for(int i=1;(1<<i)<=n;++i)
for(int j=1;j+(1<<i)-1<=n;++j)
rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
}
long int get_rmq(int a,int b){
int diff=b-a+1;
int l=logg[diff];
return min(rmq[l][a],rmq[l][b+1-(1<<l)]);
}
int main(){
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
int n,q;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;++i){
scanf("%d",&v[i]);
}
setup_rmq(n);
int x,y;
// for(int i=0;(1<<i)<=n;++i){
// for(int j=1;j<=n-(1<<i)+1;++j)
// printf("%ld ",rmq[i][j]);
// printf("\n");
// }
for(int i=1;i<=q;++i){
scanf("%d%d",&x,&y);
printf("%ld\n",get_rmq(x,y));
}
return 0;
}