Pagini recente » Cod sursa (job #2556971) | Cod sursa (job #1143396) | Cod sursa (job #1271827) | Cod sursa (job #33501) | Cod sursa (job #2928411)
#include <iostream>
#include <fstream>
#define MAX_SIZE 100000
#define LG_N 20
int rmq[LG_N][MAX_SIZE] = {0};
int log[MAX_SIZE] = {0};
int main() {
std::ifstream input("rmq.in");
std::ofstream output("rmq.out");
int n, m;
int a[MAX_SIZE] = {0};
input >> n >> m;
for (int i = 0; i < n; ++i) input >> a[i];
log[1] = 0;
for (int i = 2; i < n; ++i) {
if (i && (!(i & (i - 1)))) log[i] = log[i - 1] + 1;
else log[i] = log[i - 1];
}
for (int i = 0; i < n; ++i) {
rmq[0][i] = i;
}
for (int i = 1; (1 << i) <= n; ++i) {
for (int j = 0; j + (1 << i) < n + 1; ++j) {
if (a[rmq[i - 1][j]] <= a[rmq[i - 1][j + (1 << (i - 1))]]) {
rmq[i][j] = rmq[i - 1][j];
} else rmq[i][j] = rmq[i - 1][j + (1 << (i - 1))];
}
}
while (m--) {
int x, y;
input >> x >> y;
int k = log[y - x + 1];
int min = INT32_MAX;
if (a[rmq[k][x]] <= a[rmq[k][y - (1 << k)]]) {
min = a[rmq[k][x]];
} else min = a[rmq[k][y - (1 << k)]];
output << min << '\n';
}
return 0;
}