Pagini recente » Cod sursa (job #764776) | Cod sursa (job #766316) | Cod sursa (job #2714880) | Cod sursa (job #752169) | Cod sursa (job #2819628)
#include <bits/stdc++.h>
using namespace std;
class RMQ {
public:
RMQ() {}
RMQ(vector<int> const& v) : n(static_cast<int>(v.size()) + 1) {
log2n = static_cast<int>(log2(n));
rmq = vector<vector<int>>(log2n + 1, vector<int>(n + 1));
for (int i = 1; i <= n; ++i)
rmq[0][i] = v[i - 1];
p2 = vector<int>(log2n + 1);
p2[0] = 1;
for (int i = 1; i <= log2n; ++i)
p2[i] = p2[i - 1] << 1;
for (int i = 1; i <= log2n; ++i)
for (int j = 1; j + p2[i] - 1 <= n; ++j)
rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + p2[i - 1]]);
}
inline int Query(int const& x, int const& y) const {
int dif = y - x + 1, k = static_cast<int>(log2(dif));
return min(rmq[k][x], rmq[k][x + dif - p2[k]]);
}
private:
int n, log2n;
vector<int> p2;
vector<vector<int>> rmq;
};
void DAU(string const& task = "") {
if (!task.empty())
freopen((task + ".in").c_str(), "r", stdin),
freopen((task + ".out").c_str(), "w", stdout);
else
ios::sync_with_stdio(false),
cin.tie(0),
cout.tie(0);
}
int n, q, x, y;
vector<int> v;
int main() {
DAU("rmq");
cin >> n >> q;
v.resize(n);
for (int& x : v)
cin >> x;
RMQ rmq(v);
while (q--) {
cin >> x >> y;
cout << rmq.Query(x, y) << '\n';
}
return 0;
}