Cod sursa(job #432260)
#include <stdio.h>
long min(long x,long y)
{
if(x<y) return x;
else return y;
}
long M,N,P,x,y,A[20][100002],i,j;
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%ld%ld",&N,&M);
for(i=1;i<=N;i++) scanf("%ld",&A[0][i]);
P=0;
while(1<<P<=N) P++;
P--;
for(i=1;i<=P;i++)
for(j=1;j<=N-(1<<(i-1));j++)
A[i][j]=min(A[i-1][j],A[i-1][j+(1<<(i-1))]);
for(i=1;i<=M;i++)
{
scanf("%ld%ld",&x,&y);
P=0;
while((1<<P)<=y-x+1) P++;
P--;
printf("%ld\n",min(A[P][x],A[P][y+1-(1<<P)]));
}
return 0;
}