Pagini recente » Cod sursa (job #2570846) | Cod sursa (job #858866) | Cod sursa (job #659079) | Cod sursa (job #140705) | Cod sursa (job #2870890)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int N(1e5 + 5), LN(17);
int rmq[LN][N], p2[LN], l2[N];
void Init() {
for (int i = 2; i < N; ++i)
l2[i] = l2[i / 2] + 1;
p2[0] = 1;
for (int i = 1; i < LN; ++i)
p2[i] = p2[i - 1] * 2;
}
void Compute(int const& n) {
for (int l = 1; l <= l2[n]; ++l)
for (int i = 1; i + p2[l] - 1 <= n; ++i)
rmq[l][i] = min(rmq[l - 1][i], rmq[l - 1][i + p2[l - 1]]);
}
inline int Query(int const& x, int const& y) {
int dif = (y - x + 1), l = l2[dif];
return min(rmq[l][x], rmq[l][y - p2[l] + 1]);
}
int main() {
Init();
int n, q;
fin >> n >> q;
for (int i = 1; i <= n; ++i)
fin >> rmq[0][i];
Compute(n);
while (q--) {
int x, y;
fin >> x >> y;
fout << Query(x, y) << '\n';
}
return 0;
}