Pagini recente » Cod sursa (job #320367) | Cod sursa (job #1216721) | Cod sursa (job #2794633) | Cod sursa (job #1589691) | Cod sursa (job #1869126)
#include <stdio.h>
#include <stdlib.h>
#define getmin(a, b) (a < b) ? a : b
FILE *fin = fopen("rmq.in", "r"), *fout = fopen("rmq.out", "w");
#define NMAX 100000
#define LOG 17
int rmq[LOG + 2][NMAX + 2];
char lg[NMAX + 2];
int main() {
int N, M, v;
fscanf(fin, "%d%d", &N, &M);
for(int i = 1;i <= N;i++)
fscanf(fin, "%d", &v), rmq[0][i] = v;
for(int i = 2;i <= N;i++)
lg[i] = lg[i >> 1] + 1;
for(int j = 1;(1 << j) <= N;j++)
for(int i = 1;i + (1 << j) <= N + 1;i++) {
rmq[j][i] = getmin(rmq[j - 1][i], rmq[j - 1][i + (1 << (j - 1))]);
}
for(int i = 0;i < M;i++) {
int a, b;
fscanf(fin, "%d%d", &a, &b);
int k = b - a + 1;
k = lg[k];
fprintf(fout, "%d\n", getmin(rmq[k][a], rmq[k][b - (1 << k) + 1]));
}
fclose(fin);
fclose(fout);
return 0;
}