Pagini recente » Cod sursa (job #1357501) | Cod sursa (job #3292870) | Cod sursa (job #2136030) | Cod sursa (job #2623851) | Cod sursa (job #714054)
Cod sursa(job #714054)
#include <cstring>
#include <cstdio>
#include <cmath>
#include <memory.h>
int n, m, l;
int heap[262144];
#define min(a, b) (a < b) ? a : b
#define minim(a) if (minimum > heap[a]) minimum = heap[a];
int level(int n) {
int level = 1;
while (n > level) {
level *= 2;
}
return(level);
}
int minimum(int left, int right) {
int minimum = 0x7F7F7F7F;
while (left < right) {
if (left % 2 == 0 && right % 2 == 1) {
minim(left);
minim(right);
left /= 2;
right /= 2;
} else {
if (left % 2) {
minim(left);
++left;
} else {
minim(right);
--right;
}
}
}
minim(left);
return(minimum);
}
int main() {
memset(heap, 0x7F, 262144);
FILE * in = fopen("rmq.in", "rt");
FILE * out = fopen("rmq.out", "wt");
fscanf(in, "%d%d", &n, &m);
l = level(n);
for (int i = 0; i < n; ++i) {
fscanf(in, "%d", &heap[l + i]);
}
for (int i = l - 1; i > 0; --i) {
heap[i] = min(heap[i * 2], heap[i * 2 + 1]);
}
int a, b;
for (int i = 0; i < m; ++i) {
fscanf(in, "%d%d", &a, &b);
fprintf(out, "%d\n", minimum(l + a - 1, l + b - 1));
}
fclose(in);
fclose(out);
}