Pagini recente » Cod sursa (job #270927) | Cod sursa (job #3239569) | Cod sursa (job #124835) | Cod sursa (job #961261) | Cod sursa (job #1426074)
#include <stdio.h>
#define MAX_N 100000
#define MAX_LOG 16
#define min(a, b) ((a) < (b) ? (a) : (b))
int d[MAX_LOG + 1][MAX_N]; // d[i][j] = cel mai mic element al secventei
// care incepe de pe pozitia j si are lungime 2^i
inline int log2(int x) {
int ans;
asm ("bsr %1, %0" : "=r" (ans) : "r" (x));
return ans;
}
int main(void) {
FILE *f, *g;
int n, nTests;
int width;
f = fopen("rmq.in", "r");
fscanf(f, "%d%d", &n, &nTests);
for (register int i = 0; i < n; i++) {
fscanf(f, "%d", &d[0][i]);
}
width = log2(n);
for (register int i = 1; i <= width; i++) {
register int len = n - (1 << i);
for (register int j = 0; j <= len; j++) {
d[i][j] = min(d[i - 1][j], d[i - 1][j + (1 << (i - 1))]);
}
}
g = fopen("rmq.out", "w");
for (; nTests; nTests--) {
int lo, hi;
fscanf(f, "%d%d", &lo, &hi);
width = log2(hi - lo + 1);
fprintf(g, "%d\n", min(d[width][lo - 1], d[width][hi - (1 << width)]));
}
fclose(f);
fclose(g);
return 0;
}