Pagini recente » Cod sursa (job #3038363) | Cod sursa (job #2614987) | Cod sursa (job #2819243) | Cod sursa (job #1356610) | Cod sursa (job #2623650)
#include <iostream>
#include <fstream>
const int MAX_N = 1e5 + 1;
const int MAX_LOG_N = 18;
int main()
{
std::ifstream fin("rmq.in");
std::ofstream fout("rmq.out");
int n, m;
fin >> n >> m;
int arr[MAX_N];
for (int i = 0; i < n; ++i) {
fin >> arr[i];
}
int lg[MAX_N];
lg[0] = lg[1] = 0;
for (int number = 2; number <= n; ++number) {
lg[number] = lg[number / 2] + 1;
}
int rmq[MAX_N][MAX_LOG_N];
// initialize for the intervals with length 1
for (int i = 0; i < n; ++i) {
rmq[i][0] = i;
}
// compute values from smaller to bigger intervals
for (int j = 1; (1 << j) <= n; ++j) {
for (int i = 0; i + (1 << j) - 1 < n; ++i) {
if (arr[rmq[i][j - 1]] < arr[rmq[i + (1 << (j - 1))][j - 1]]) {
rmq[i][j] = rmq[i][j - 1];
}
else {
rmq[i][j] = rmq[i + (1 << (j - 1))][j - 1];
}
}
}
while (m--) {
int x, y;
fin >> x >> y;
x--;
y--;
int k = lg[y - x + 1];
fout << std::min(arr[rmq[x][k]], arr[rmq[y - (1 << k) + 1][k]]) << '\n';
}
return 0;
}