Pagini recente » Cod sursa (job #2308717) | Cod sursa (job #2748678) | Cod sursa (job #2159428) | Cod sursa (job #3176878) | Cod sursa (job #2819629)
#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;
};
const string task("rmq");
ifstream fin(task + ".in");
ofstream fout(task + ".out");
int n, q, x, y;
vector<int> v;
int main() {
fin >> n >> q;
v.resize(n);
for (int& x : v)
fin >> x;
RMQ rmq(v);
while (q--) {
fin >> x >> y;
fout << rmq.Query(x, y) << '\n';
}
fin.close();
fout.close();
return 0;
}