Pagini recente » Cod sursa (job #2398980) | Cod sursa (job #1316766) | Cod sursa (job #1222746) | Cod sursa (job #1253676) | Cod sursa (job #1092663)
#include <fstream>
#include <iostream>
using namespace std;
const int MAXN = 100005;
const int MAXLG = 20;
int N, M, RMQ[MAXLG][MAXN], lg[MAXN], A[MAXN];
int main() {
ifstream fin("rmq.in");
ofstream fout("rmq.out");
fin >> N >> M;
for(int i = 1 ; i <= N ; ++ i)
fin >> A[i];
for(int i = 2 ; i <= N ; ++ i)
lg[i] = lg[i >> 1] + 1;
for(int i = 1 ; i <= N ; ++ i)
RMQ[0][i] = i;
for(int i = 1 ; (1 << i) <= N ; ++ i)
for(int j = 1 ; j + (1 << i) - 1 <= N ; ++ j) {
int l = 1 << (i - 1);
RMQ[i][j] = RMQ[i-1][j];
if(A[RMQ[i][j]] > A[RMQ[i - 1][j + l]])
RMQ[i][j] = RMQ[i - 1][j + l];
}
for(int i = 1 ; i <= M ; ++ i) {
int x, y;
fin >> x >> y;
int LG = lg[x - y + 1];
int Ans = RMQ[LG][x];
if(A[Ans] > A[RMQ[LG][y - (1 << LG) + 1]])
Ans = RMQ[LG][y - (1 << LG) + 1];
fout << A[Ans] << '\n';
}
return 0;
}