Pagini recente » Cod sursa (job #3159337) | Cod sursa (job #542327) | Cod sursa (job #1098676) | Cod sursa (job #446515) | Cod sursa (job #2703190)
#include <fstream>
#include <vector>
using namespace std;
int main() {
ifstream fin("rmq.in");
int n, m;
fin >> n >> m;
// log[i] = [log2(i)]
vector<int> log(n + 1, 0);
for (int i = 2; i <= n; i++) {
log[i] = log[i >> 1] + 1;
}
// rmq[j][i] = min for [i, i + 2 ^ j - 1]
// rmq[j][i] = min(rmq[j - 1][i], rmq[j - 1][i + 2 ^ j - 2 ^ (j - 1)])
vector<vector<int> > rmq(log[n] + 1);
for (int i = 0; i <= log[n]; i++) {
rmq[i].resize(n + 1);
}
for (int i = 1; i <= n; i++) {
fin >> rmq[0][i];
}
for (int j = 1; j <= log[n]; j++) {
for (int i = 1; i + (1 << j) - 1 <= n; i++) {
rmq[j][i] = min(rmq[j - 1][i], rmq[j - 1][i + (1 << j) - (1 << (j - 1))]);
}
}
ofstream fout("rmq.out");
for (int i = 0; i < m; i++) {
int left, right;
fin >> left >> right;
int log_diff = log[right - left + 1];
int ans = min(
rmq[log_diff][left],
rmq[log_diff][right - (1 << log_diff) + 1]
);
fout << ans << endl;
}
fin.close();
fout.close();
return 0;
}