Pagini recente » Cod sursa (job #940494) | Cod sursa (job #1903486) | Cod sursa (job #937826) | Cod sursa (job #1422149) | Cod sursa (job #2841109)
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
template <typename T> class RMQ {
vector <int> log2; vector <vector <T>> dp;
int n, h;
function <T(T, T)> f;
public:
template <typename Iterator> RMQ(Iterator op, Iterator ed, function <T(T, T)> _f) : n(ed - op), f(_f) {
h = 31 - __builtin_clz(n);
log2.resize(n + 1, 0); dp.resize(h + 1);
for(int i = 2; i <= n; i++) log2[i] = log2[i >> 1] + 1;
dp[0].resize(n);
int i = 0;
for(Iterator it = op; it != ed; it++, i++) dp[0][i] = *it;
for(int j = 1; j <= h; j++) {
int jj = (1 << (j - 1)), nj = n - (1 << j);
dp[j].resize(nj + 1);
for(int i = 0; i <= nj; i++) dp[j][i] = f(dp[j - 1][i], dp[j - 1][i + jj]);
}
}
T query(int l, int r) { /// indexat de la 0 pe intervalul [l, r)
int hh = log2[r - l];
return f(dp[hh][l], dp[hh][r - (1 << hh)]);
}
};
int a[N + 5], l, r;
int main() {
ifstream cin("rmq.in");
ofstream cout("rmq.out");
int n, q;
cin >> n >> q;
for(int i = 0; i < n; i++) cin >> a[i];
RMQ <int> rmq(a, a + n, [](int a, int b) { return min(a, b); });
for(int i = 0, l, r; i < q; i++) {
cin >> l >> r;
cout << rmq.query(l - 1, r) << " ";
}
return 0;
}