Cod sursa(job #343378)
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100010
#define MAXLOGN 20
long A[MAXN],M[MAXN][MAXLOGN],N,NQ,LG[MAXN];
long min(long x,long y) {return (x<y)?x:y;}
int main() {
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%ld%ld",&N,&NQ);
long i,j,x,y,k,l,res;
for (i=0;i<N;++i) scanf("%ld",&A[i]);
for (i=2;i<=N;++i) {LG[i] = LG[i/2]+1;}
for (i=0;i<N;++i) { M[i][0] = A[i];}
for (j=1;(1<<j)<=N;++j)
for (i=0;i + (1<<j) - 1 < N;++i)
M[i][j] = min(M[i][j-1],M[i+(1<<(j - 1))][j-1]);
for (i=0;i<NQ;++i) {
scanf("%ld%ld",&x,&y);
--x;--y;
k = LG[y-x+1];
l = y-(1<<k)+1;
res = (M[x][k]<M[l][k])?M[x][k]:M[l][k];
printf("%ld\n",res);
}
fclose(stdin);
fclose(stdout);
fprintf(stderr,"%ld\n",clock());
return 0;
}