Pagini recente » Cod sursa (job #41799) | Cod sursa (job #630447) | Cod sursa (job #551543) | Cod sursa (job #1559673) | Cod sursa (job #3254555)
#include <stdio.h>
#include <cmath>
#include <limits>
const int NMAX = 100000, LOGMAX = 17;
int rmq[LOGMAX][NMAX];
int min(int a, int b) {
return a < b ? a : b;
}
int main() {
FILE *fin, *fout;
int n, m, i, l, ln, r, ohio;
fin = fopen("rmq.in", "r");
fscanf(fin, "%d%d", &n, &m);
for (i = 0; i < n; i++) {
fscanf(fin, "%d", &rmq[0][i]);
}
for (l = 1; (1 << l) <= n; l++) {
for (i = 0; i + (1 << l) - 1 < n; i++) {
rmq[l][i] = min(rmq[l - 1][i], rmq[l - 1][i + (1 << (l - 1))]);
}
ohio = rmq[l][i - 1];
for (; i < n; i++) {
// rmq[l][i] = std::numeric_limits<int>::max();
rmq[l][i] = ohio;
}
}
/*
for (l = 0; (1 << l) <= n; l++) {
for (i = 0; i < n; i++) {
printf("%d ", rmq[l][i]);
}
fputc('\n', stdout);
}
*/
fout = fopen("rmq.out", "w");
for (i = 0; i < m; i++) {
fscanf(fin, "%d%d", &l, &r);
l--;
r--;
ohio = (int)log2(r - l + 1);
fprintf(fout, "%d\n", min(rmq[ohio][l], rmq[ohio][r - (1 << ohio) + 1]));
}
fclose(fin);
fclose(fout);
return 0;
}