Pagini recente » Cod sursa (job #1897205) | Cod sursa (job #1159573) | Cod sursa (job #805472) | Cod sursa (job #1126157) | Cod sursa (job #820017)
Cod sursa(job #820017)
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
int main() {
ifstream inf("rmq.in");
ofstream outf("rmq.out");
int n, m;
inf >> n >> m;
int nums[n+1];
for (int i = 0; i < n; i++)
inf >> nums[i];
// pre process rmq
int logn = log2(n);
int rmq[n][logn]; // TODO maybe + 1?
for (int i = 0; i < n; i++) {
rmq[i][0] = i; // intervals of length 2^0 = 1
}
for (int j = 1; 1 << j <= n; j++) {
for (int i = 0; i + (1 << j) - 1 < n; i++) {
int minSeg1 = rmq[i][j-1];
int minSeg2 = rmq[ i + (1 <<(j-1))][j-1];
if (nums[minSeg1] < nums[minSeg2]) {
rmq[i][j] = minSeg1;
} else {
rmq[i][j] = minSeg2;
}
}
}
int a, b;
for (int i = 0; i < m; i++) {
inf >> a >> b;
a--; b--;
// process query
int k = log2(b - a + 1);
int res = min(nums[rmq[a][k]],
nums[rmq[b - (1 << k) + 1][k]]);
outf << res << endl;
}
return 0;
}