Pagini recente » Cod sursa (job #910856) | Cod sursa (job #2792750) | Cod sursa (job #1352396) | Cod sursa (job #1812453) | Cod sursa (job #2602667)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
template<class T>
class Range_minimum_query {
public:
explicit Range_minimum_query(std::vector<T> &asd);
T query(int i, int j);
private:
std::vector<std::vector<T>> lookup;
};
template<class T>
Range_minimum_query<T>::Range_minimum_query(std::vector<T> &asd) {
lookup.resize(asd.size(), std::vector<T>(log2(asd.size()) + 1));
for (int i = 0; i < asd.size(); i++) {
lookup[i][0] = asd[i];
}
for (int j = 1; j < lookup[0].size(); j++) {
for (int i = 0; i <= lookup.size() - (1 << j); i++) {
lookup[i][j] = std::min(lookup[i][j - 1], lookup[i + (1 << j) / 2][j - 1]);
}
}
}
template<class T>
T Range_minimum_query<T>::query(int i, int j) {
int lg = log2(j - i + 1);
return std::min(lookup[i][lg], lookup[j - (1 << lg) + 1][lg]);
}
int main() {
std::ifstream fin("rmq.in");
std::ofstream fout("rmq.out");
std::vector<int> a;
int n, m;
fin >> n >> m;
a.resize(n);
for (int i = 0; i < n; i++) fin >> a[i];
Range_minimum_query<int> rmq(a);
int f, g;
for (int i = 0; i < m; i++) {
fin >> f >> g;
fout << rmq.query(f-1, g-1)<<"\n";
}
return 0;
}