Pagini recente » Cod sursa (job #1136647) | Cod sursa (job #260709) | Cod sursa (job #3233785) | Cod sursa (job #2974243) | Cod sursa (job #3288394)
#include <fstream>
#include <iostream>
using namespace std;
#define MAXN 100005
#define LOG_BASE_2 18
int n, m, v[MAXN], range_min[LOG_BASE_2][MAXN];
int RMQ(int left, int right) {
if (left == right)
return v[left];
int len = (right - left + 1);
int log_base_2 = 0;
while ((1 << log_base_2) < len)
log_base_2++;
log_base_2--;
int pow2 = 1 << (log_base_2);
return min(
range_min[log_base_2][left],
range_min[log_base_2][right - pow2 + 1]
);
}
void Precompute() {
for (int i = 1; i <= n; i++)
range_min[0][i] = v[i];
for (int exp = 1; exp < LOG_BASE_2; exp++) {
for (int i = 1; i + (1 << exp) - 1 <= n; i++) {
range_min[exp][i] = min(
range_min[exp - 1][i],
range_min[exp - 1][i + (1 << (exp-1))]
);
}
}
}
int main() {
ifstream fin("rmq.in");
ofstream fout("rmq.out");
fin >> n >> m;
for (int i = 1; i <= n; i++)
fin >> v[i];
Precompute();
int left, right;
while (m--) {
fin >> left >> right;
fout << RMQ(left, right) << "\n";
}
return 0;
}