Cod sursa(job #373717)
#include<iostream>
#include<string>
using namespace std;
#define NM 100005
#define PM 17
#define FOR(i,a,b)for(int i=(a);i<=(b);++i)
int A[NM],RMQ[NM][PM],L[NM],N,M;
int main()
{
int a,b;
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%d %d",&N,&M);
FOR(i,1,N)
scanf("%d",&A[i]);
int cat=0,poz=1;
while(poz<N)
{
int end=poz+(1<<cat)-1;
while(poz<=N && poz<=end)
{
L[poz]=cat;
++poz;
}
++cat;
}
/*
FOR(i,1,N)
printf("%d ",L[i]);
*/
FOR(i,1,N)
RMQ[i][0]=A[i];
FOR(l,1,16)
FOR(i,1,N)
{
if(i+(1<<l)-1>N) break;
RMQ[i][l]=min(RMQ[i][l-1],RMQ[i+(1<<(l-1))][l-1]);
}
FOR(i,1,M)
{
scanf("%d %d",&a,&b);
int l=L[b-a+1];
int ans=min(RMQ[a][l],RMQ[b-(1<<l)+1][l]);
printf("%d\n",ans);
}
return 0;
}