Pagini recente » Cod sursa (job #1142489) | Cod sursa (job #2950998) | Cod sursa (job #3283129) | Cod sursa (job #1277333) | Cod sursa (job #2998743)
#include <iostream>
#include <vector>
#include <fstream>
struct RMQ {
private:
std::vector<int> log;
std::vector<int> *v;
std::vector<std::vector<int>> mat;
public:
explicit RMQ(std::vector<int> *const input) {
this->v = input;
size_t size = input->size();
log.resize(2, 0);
for (int i = 2; i <= size; ++i) {
log.push_back(log[i / 2] + 1);
}
mat.resize(log.back() + 1, std::vector<int>(size + 1, 0));
for (int i = 1; i <= size; ++i) {
mat[0][i] = i;
}
for (int i = 1; i <= log.back(); ++i) {
for (int j = 1; j <= size; ++j) {
if (j + (1 << (i - 1)) > size) continue;
if ((*v)[mat[i - 1][j]] < (*v)[mat[i - 1][j + (1 << (i - 1))]]) {
mat[i][j] = mat[i - 1][j];
} else mat[i][j] = mat[i - 1][j + (1 << (i - 1))];
}
}
}
int query(int left, int right) {
int log_diff = log[right - left];
if ((*v)[mat[log_diff][left]] < (*v)[mat[log_diff][right + 1 - (1 << log_diff)]]) {
return mat[log_diff][left];
}
return mat[log_diff][right + 1 - (1 << log_diff)];
}
};
int main() {
std::ifstream input("rmq.in");
std::ofstream output("rmq.out");
std::vector<int> v;
int n, q;
input >> n >> q;
v.resize(n + 1, 0);
for (int i = 1; i <= n; ++i) input >> v[i];
RMQ rmq(&v);
while (q--) {
int x, y;
input >> x >> y;
output << v[rmq.query(x, y)] << '\n';
}
return 0;
}