Cod sursa(job #923078)
#include<fstream>
#define NMAX 100004
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int N,Q,V[NMAX],M[NMAX][20],log2[NMAX],x,y,k;
void pre()
{
for (int i=1;i<=N;i++)
M[i][0]=i;
for (int j=1;(1<<j)<=N;j++)
for (int i=1;i<=N-(1<<j)+1;i++)
if (V[ M[i][j-1] ] < V[ M[i+(1<<j-1)][j-1] ] )
M[i][j]= M[i][j-1];
else
M[i][j]= M[i+(1<<j-1)][j-1];
}
int main()
{
f>>N>>Q;
for (int i=1;i<=N;i++)
f>>V[i];
pre();
for (int i=2;i<=N;i++)
log2[i]=log2[i/2]+1;
for (int i=1;i<=Q;i++)
{
f>>x>>y;
k=log2[y-x+1];
g<<min(V[ M[x][k] ], V[ M[y-(1<<k)+1][k] ])<<'\n';
}
return 0;
}