Pagini recente » Cod sursa (job #1521530) | Cod sursa (job #643859) | Cod sursa (job #2031125) | Cod sursa (job #2582028) | Cod sursa (job #1426061)
#include <stdio.h>
#define MAX_N 100000
#define MAX_LOG 16
#define min(a, b) ((a) < (b) ? (a) : (b))
int d[MAX_LOG][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) {
if (x == 1) {
return 0;
}
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]);
}
for (register int i = 1; (1 << i) < n; i++) {
for (int j = 0; j + (1 << i) <= n; 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;
}