Pagini recente » Cod sursa (job #1545765) | Cod sursa (job #788249) | Cod sursa (job #1794037) | Cod sursa (job #424537) | Cod sursa (job #1804375)
#include <iostream>
#include <vector>
#include <math.h>
#include <stdio.h>
using namespace std;
int main() {
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int n, m, a;
scanf("%d %d", &n, &m);
vector<int> v(n, 0);
for (int i = 0; i < n; i ++)
scanf("%d", &v[i]);
int l = (int)(log(n) / log(2));
vector<vector<int> > rmq(n, vector<int>(l + 1));
for (int i = 0; i < n; i ++)
rmq[i][0] = i;
for (int j = 1; j <= l; j ++)
for (int i = 0; i < n - (1 << (j - 1)); i ++)
rmq[i][j] = (v[rmq[i][j - 1]] < v[rmq[i + (1 << (j - 1))][j - 1]] ? rmq[i][j - 1] : rmq[i + (1 << (j - 1))][j - 1]);
/*for (int i = 0; i < n; i ++){
for (int j = 0; j <= l; j ++)
cout << rmq[i][j] << " ";
cout << endl;
}*/
for (int i = 0; i < m; i ++) {
int r1, r2;
scanf("%d %d", &r1, &r2);
r1 --;
r2 --;
int range = r2 - r1 + 1, lr = (int)(log(range) / log(2));
int sol = rmq[r1][lr];
range -= (1 << lr);
if (range != 0)
sol = (v[sol] < v[rmq[r1 + range][lr]] ? sol : rmq[r1 + range][lr]);
printf("%d\n", v[sol]);
}
return 0;
}