Pagini recente » Cod sursa (job #1461789) | Cod sursa (job #2564325) | Cod sursa (job #2674361) | Cod sursa (job #955250) | Cod sursa (job #2939568)
#include <fstream>
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
const int nmax = 1e5, logn = 17;
int n, m, v[nmax + 1], ezlog[nmax + 1], rmq[nmax + 1][logn + 1];
int query(int i, int j) {
int len = ezlog[j - i + 1];
if (v[rmq[i][len]] <= v[rmq[j - (1 << len) + 1][len]])
return rmq[i][len];
return rmq[j - (1 << len) + 1][len];
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> v[i];
ezlog[0] = -1;
for (int i = 1; i <= nmax; i++)
ezlog[i] = ezlog[i / 2] + 1;
for (int i = 1; i <= n; i++)
rmq[i][0] = i;
for (int j = 1; (1 << j) <= n; j++) {
for (int i = 1; i + (1 << j) - 1 <= n; i++) {
if (v[rmq[i][j - 1]] < v[rmq[i + (1 << (j - 1))][j - 1]])
rmq[i][j] = rmq[i][j - 1];
else
rmq[i][j] = rmq[i + (1 << (j - 1))][j - 1];
}
}
for (int i = 1; i <= m; i++) {
int x, y;
cin >> x >> y;
cout << v[query(x, y)] << "\n";
}
}