Pagini recente » Cod sursa (job #773195) | Cod sursa (job #87288) | Cod sursa (job #471276) | Cod sursa (job #2201050) | Cod sursa (job #2351825)
#include <bits/stdc++.h>
using namespace std;
class RMQ {
private:
vector < int > logVec;
vector < vector < int > > rmqVec;
public:
RMQ(vector < int > _RMQ){
logVec.assign(_RMQ.size() + 1, 0);
for (int i = 2; i < logVec.size(); i++) {
logVec[i] = logVec[i / 2] + 1;
}
rmqVec.assign(logVec.back() + 1, vector < int >(_RMQ.size()));
rmqVec[0] = _RMQ;
for (int logX = 1; logX < rmqVec.size(); logX++) {
for (int i = 0; i + (1 << logX) <= _RMQ.size(); i++) {
rmqVec[logX][i] = min(rmqVec[logX - 1][i], rmqVec[logX - 1][i + (1 << (logX - 1))]);
}
}
}
int getMin(int l, int r) { // ! returns the answer for the interval [l, r) !
int logX = logVec[r - l];
return min(rmqVec[logX][l], rmqVec[logX][r - (1 << logX)]);
}
};
vector < int > V;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
ifstream cin("rmq.in");
ofstream cout("rmq.out");
int n, m;
cin >> n >> m;
for (int i = 1, x; i <= n; i++) {
cin >> x;
V.push_back(x);
}
RMQ rmq(V);
while (m--) {
int x, y;
cin >> x >> y;
cout << rmq.getMin(x - 1, y) << "\n";
}
return 0;
}