Pagini recente » Cod sursa (job #2268319) | Cod sursa (job #2104307) | Cod sursa (job #3265561) | Cod sursa (job #387610) | Cod sursa (job #2871098)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
std::fstream in ("rmq.in", std::ios::in) ;
std::fstream out ("rmq.out", std::ios::out | std::ios::binary) ;
template <typename T>
class RMQ {
std::vector<T> lg ;
std::vector<std::vector<T> > rmq ;
T minim(T a, T b) {
return (a + (b - a) * (b < a)) ;
}
public:
RMQ(int n, std::vector<T> v) {
lg.push_back(0) ;
lg.push_back(0) ;
rmq = std::vector<std::vector<T>>(1 + int(log2(n)), std::vector<T>(n + 1)) ;
for (int i = 1 ; i <= n ; ++ i) {
rmq[0][i] = v[i] ;
lg.push_back(lg[(i + 1) / 2] + 1) ;
}
for (int len = 1 ; (1 << len) <= n ; ++ len) {
for (int i = 1 ; i + (1 << len) - 1 <= n ; ++ i) {
rmq[len][i] = minim(rmq[len - 1][i], rmq[len - 1][i + (1 << (len - 1))]) ;
}
}
}
T query(int left, int right) {
int intLen = lg[right - left + 1] ;
return minim(rmq[intLen][left], rmq[intLen][right - (1 << intLen) + 1]) ;
}
};
void solve() {
int n, querys ;
in >> n >> querys ;
std::vector<int> vec(n + 1) ;
for (int i = 1 ; i <= n ; ++ i) {
in >> vec[i] ;
}
RMQ rmq(n, vec) ;
for (int i = 1, x, y ; i <= querys ; ++ i) {
in >> x >> y ;
out << rmq.query(x, y) << '\n' ;
}
}
int main() {
int testcases(1) ;
for ( ; testcases ; -- testcases) {
solve() ;
}
}