Pagini recente » Cod sursa (job #2222365) | Cod sursa (job #3198584) | Cod sursa (job #57171) | Cod sursa (job #1621435) | Cod sursa (job #1541358)
#include <bits/stdc++.h>
using namespace std;
class Rmq {
public:
vector<int>A, lgTwo;
vector<vector<int>>work;
Rmq(int n = 0, const vector<int>&Array = vector<int>()) :
work(log2(n) + 1, vector<int>(n)),
A(Array) {};
void BuildRMQ() {
const static int &N = A.size();
for(int i = 0; i < N; ++i)
work[0][i] = A[i];
for(int rangeQ = 1; rangeQ < (int)work.size(); ++rangeQ)
for(int i = 0; i < N; ++i)
work[rangeQ][i] = min(work[rangeQ - 1][i], work[rangeQ - 1][i + (1 << (rangeQ - 1))]);
lgTwo = vector<int>(*max_element(A.begin(), A.end()) + 1, 0);
for(int i = 2; i < (int)lgTwo.size(); ++i)
lgTwo[i] = lgTwo[i >> 1] + 1;
}
int query(int from, int to) {
int traversal = to - from + 1, usingLog = lgTwo[traversal];
return min(work[usingLog][from], work[usingLog][to - (1 << usingLog) + 1]);
}
};
int main() {
ifstream cin("rmq.in");
ofstream cout("rmq.out");
int N, tests;
cin >> N >> tests;
vector<int>A(N, 0);
for(int i = 0; i < N; ++i)
cin >> A[i];
Rmq object(N, A);
object.BuildRMQ();
while(tests--) {
int node, edge;
cin >> node >> edge;
cout << object.query(node - 1, edge - 1) << '\n';
}
return 0;
}