Pagini recente » Cod sursa (job #409150) | Cod sursa (job #2552527) | Cod sursa (job #147309) | Cod sursa (job #2266219) | Cod sursa (job #2703191)
#include <stdio.h>
#include <algorithm>
using namespace std;
const int LG_MAX = 19;
const int N_MAX = 100001;
// 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)])
int rmq[LG_MAX][N_MAX];
// lg[i] = [log2(i)]
int lg[N_MAX];
int main() {
FILE * fin, * fout;
fin = fopen("rmq.in", "r");
int n, m;
fscanf(fin, "%d %d", &n, &m);
for (int i = 2; i <= n; i++) {
lg[i] = lg[i >> 1] + 1;
}
for (int i = 1; i <= n; i++) {
fscanf(fin, "%d", &rmq[0][i]);
}
for (int j = 1; j <= lg[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))]);
}
}
fout = fopen("rmq.out", "w");
for (int i = 0; i < m; i++) {
int left, right;
fscanf(fin, "%d %d", &left, &right);
int log_diff = lg[right - left + 1];
int ans = min(
rmq[log_diff][left],
rmq[log_diff][right - (1 << log_diff) + 1]
);
fprintf(fout, "%d\n", ans);
}
fclose(fin);
fclose(fout);
return 0;
}