Cod sursa(job #738575)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstdio>
using namespace std;
#define NMAX 100005
#define LOGNMAX 20
int N, M, A[NMAX], P[NMAX][LOGNMAX];
void preprocess(){
for(int i = 0; i < N; ++i)
P[i][0] = A[i];
for(int j = 1; j < LOGNMAX; ++j)
for(int i = 0; (i + (1 << j) - 1) < N; ++i)
P[i][j] = min(P[i][j-1], P[i + (1 << (j-1))][j-1]);
}
int solve(int x, int y){
int z = (y - x + 1), log;
for(log = 0; (1<<log) < z; ++log);
if(log > 0) --log;
return min(P[x][log], P[y - (1<<log) + 1][log]);
}
int main(){
//ifstream in ("rmq.in");
//ofstream out ("rmq.out");
freopen("rmq.in", "rt", stdin);
freopen("rmq.out", "wt", stdout);
//in >> N >> M;
scanf("%d %d", &N, &M);
for(int i = 0; i < N; ++i)
//in >> A[i];
scanf("%d", &A[i]);
preprocess();
for(int i = 0; i < M; ++i){
int x, y;
//in >> x >> y;
scanf("%d %d", &x, &y);
int ret = solve(x-1, y-1);
//out << ret << endl;
printf("%d\n", ret);
}
return 0;
}