Pagini recente » Cod sursa (job #2583134) | Cod sursa (job #1195232) | Cod sursa (job #159639) | Cod sursa (job #2000795) | Cod sursa (job #2922761)
#include <stdio.h>
#define MAX_N 100005
int vec[MAX_N];
int rmq[20][MAX_N];
static inline int min(int a, int b) { return a < b ? a : b; }
void InitRMQ(int n) {
for (int lvl = 1; (1 << lvl) <= n; lvl++) {
for (int index = 0; index + (1 << lvl) <= n; index++) {
rmq[lvl][index] = min(rmq[lvl - 1][index], rmq[lvl - 1][index + (1 << (lvl - 1))]);
}
}
}
int query(int pos1, int pos2) {
int put = 0;
for (int val = 16; val; val >>= 1) {
if (1 << (put + val) < pos2 - pos1 + 1) {
put += val;
}
}
return min(rmq[put][pos1], rmq[put][pos2 - (1 << put) + 1]);
}
int main() {
FILE *fin, *fout;
int n, m;
int i, pos1, pos2;
fin = fopen("rmq.in", "r");
fscanf(fin, "%d%d", &n, &m);
for (i = 0; i < n; i++) {
fscanf(fin, "%d", &vec[i]);
rmq[0][i] = vec[i];
}
InitRMQ(n);
fout = fopen("rmq.out", "w");
for (i = 0; i < m; i++) {
fscanf(fin, "%d%d", &pos1, &pos2);
fprintf(fout, "%d\n", query(pos1 - 1, pos2 - 1));
}
fclose(fin);
fclose(fout);
return 0;
}