Pagini recente » Cod sursa (job #726890) | Cod sursa (job #792126) | Cod sursa (job #2803774) | Cod sursa (job #828367) | Cod sursa (job #2238929)
#include <cmath>
#include <cstdio>
#include <vector>
#include <utility>
class RMQ {
public:
RMQ(int n) {
int size = (int) (std::log(n) / std::log(2)) + 1;
matrix.resize(n);
for (auto &row : matrix) {
row.resize(size);
}
}
void read() {
for (auto &row : matrix) {
scanf("%d", &row.front());
}
}
void buildMatrix() {
size_t pos = 0;
for (size_t d = 1; d < matrix.front().size(); d++) {
for (size_t idx = 0; idx < matrix.size(); idx++) {
pos = idx + (1 << (d - 1));
if (pos < matrix.size()) {
matrix[idx][d] = std::min(matrix[idx][d - 1], matrix[pos][d - 1]);
} else {
matrix[idx][d] = matrix[idx][d - 1];
}
}
}
}
int findMin(int a, int b) {
if (a > b) {
std::swap(a, b);
}
size_t d = (size_t) (std::log(b - a + 1) / std::log(2));
return std::min(matrix[a][d], matrix[b - (1 << d) + 1][d]);
}
private:
std::vector<std::vector<int>> matrix;
};
int main() {
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int n, m, a, b;
scanf("%d %d", &n, &m);
RMQ rmq(n);
rmq.read();
rmq.buildMatrix();
while (m-- > 0) {
scanf("%d %d", &a, &b);
printf("%d\n", rmq.findMin(a - 1, b - 1));
}
return 0;
}