Pagini recente » Cod sursa (job #1972106) | Cod sursa (job #1696815) | Cod sursa (job #1385107) | Cod sursa (job #140745) | Cod sursa (job #2816757)
#include <stdio.h>
#define MAX_N 100000
#define MAX_LOG 16
int v[MAX_N];
int log2[MAX_N + 1];
int table[MAX_N][MAX_LOG + 1];
inline int f(int x, int y) {
return x < y ? x : y;
}
void precomputeLogs(int n) {
int i;
log2[1] = 0;
for (i = 2; i <= n; ++i)
log2[i] = log2[i / 2] + 1;
}
void build(int n) {
int i, p;
for (i = 0; i < n; ++i)
table[i][0] = v[i];
for (p = 1; p <= MAX_LOG; ++p)
for (i = 0; i + (1 << p) - 1 < n; ++i)
table[i][p] = f(table[i][p - 1], table[i + (1 << (p - 1))][p - 1]);
}
int query(int left, int right) {
int len, log;
len = (right - left + 1);
log = log2[len];
return f(table[left][log], table[right - (1 << log) + 1][log]);
}
int main() {
FILE *fin, *fout;
fin = fopen("rmq.in", "r");
fout = fopen("rmq.out", "w");
int n, m, i, a, b;
fscanf(fin, "%d%d", &n, &m);
for (i = 0; i < n; ++i)
fscanf(fin, "%d", &v[i]);
precomputeLogs(n);
build(n);
while (m--) {
fscanf(fin, "%d%d", &a, &b);
fprintf(fout, "%d\n", query(a - 1, b - 1));
}
fclose(fin);
fclose(fout);
return 0;
}