Pagini recente » Cod sursa (job #639510) | Cod sursa (job #2128653) | Cod sursa (job #1579126) | Cod sursa (job #2500335) | Cod sursa (job #2760587)
#include <bits/stdc++.h>
using namespace std;
int lg(int x) { return 31 - __builtin_clz(x); }
struct RMQ{
vector<int> dp[32];
RMQ(const vector<int> &v) {
int n = v.size();
for (int step = 0; (1 << step) <= n; ++step){
dp[step].resize(n + 1, 1e9);
for (int l = (1 << step), c = l; c < n + l; c += (l << 1)){
for (int i = c + 1; i <= min(n, c + l); i++)
dp[step][i] = min(dp[step][i - 1], v[i - 1]);
for (int i = min(n, c) - 1; i >= c - l; i--)
dp[step][i] = min(v[i], dp[step][i + 1]);
}
}
}
int Query(int l, int r){
int h = lg(l ^ r);
return min(dp[h][l], dp[h][r]);
}
};
int main() {
ifstream cin("rmq.in");
ofstream cout("rmq.out");
int n, m; cin >> n >> m;
vector<int> v(n);
for (int i = 0; i < n; ++i)
cin >> v[i];
RMQ rmq(v);
for (int i = 0; i < m; ++i) {
int a, b; cin >> a >> b;
cout << rmq.Query(a - 1, b) << '\n';
}
return 0;
}