Pagini recente » Cod sursa (job #3366012) | Cod sursa (job #3366447) | Monitorul de evaluare | Cod sursa (job #3366022) | Cod sursa (job #3366731)
#include <fstream>
#include <iostream>
std::ifstream fin("rmq.in");
std::ofstream fout("rmq.out");
int n, m;
int rmq[18][100005], e[100005], a[100005];
void buildRMQ() {
e[0] = e[1] = 0;
for (int i = 2; i <= n; i++) {
e[i] = e[i / 2] + 1;
}
for (int i = 1; i <= n; i++) {
rmq[0][i] = a[i];
}
for (int i = 1; i <= e[n]; i++) {
for (int j = 1; j <= n - (1 << i) + 1; j++) {
rmq[i][j] = std::min(rmq[i - 1][j], rmq[i - 1][j + (1 << i) - 1]);
}
}
}
int query(int x, int y) {
int expo, L;
L = y - x + 1;
expo = e[L];
return std::min(rmq[expo][x], rmq[expo][y - (1 << expo) + 1]);
}
int main() {
int x, y;
fin >> n >> m;
for (int i = 1; i <= n; i++) {
fin >> a[i];
}
buildRMQ();
for (int i = 0; i <= e[n]; i++) {
for (int j = 1; j <= n; j++) {
std::cout << rmq[i][j] << " ";
}
std::cout << "\n";
}
for (int i = 1; i <= m; i++) {
fin >> x >> y;
fout << query(x, y) << "\n";
}
}