Pagini recente » Cod sursa (job #3140900) | Cod sursa (job #737836) | Cod sursa (job #2444512) | Cod sursa (job #3200436) | Cod sursa (job #2902488)
#include <fstream>
#include <vector>
int main() {
std::ifstream ifs("rmq.in");
int n, m;
ifs >> n >> m;
std::vector<int> log2_table(n + 1);
log2_table[1] = 0;
for (int i = 2; i <= n; ++i) {
log2_table[i] = log2_table[i / 2] + 1;
}
std::vector<std::vector<int>> sparse_table(n);
for (int i = 0; i < n; ++i) {
int x;
ifs >> x;
sparse_table[i].resize(log2_table[n]);
sparse_table[i][0] = x;
}
for (int j = 1; (1 << j) <= n; ++j) {
for (int i = 0; i + (1 << j) - 1 < n; ++i) {
sparse_table[i][j] =
std::min(sparse_table[i][j - 1],
sparse_table[i + (1 << (j - 1))][j - 1]);
}
}
std::ofstream ofs("rmq.out");
// Read queries
for (int q = 0; q < m; ++q) {
int l, r;
ifs >> l >> r;
// Input is 1-indexed
l--; r--;
int j = log2_table[r - l + 1];
ofs << std::min(sparse_table[l][j], sparse_table[r - (1 << j) + 1][j]) << '\n';
}
ifs.close();
ofs.close();
return 0;
}