Pagini recente » Cod sursa (job #2396404) | Cod sursa (job #762029) | Cod sursa (job #1700815) | Cod sursa (job #89321) | Cod sursa (job #1459885)
#include <iostream>
#include <fstream>
#define MAX 100005
#define LMAX 18
#define MIN(a, b) ((a) < (b)) ? (a) : (b)
int n, m, M[MAX][LMAX], v[MAX];
int l2 (int x) {
int i = 0;
while (x > 1) {
x >>= 1;
++i;
}
return i;
}
void preprocess () {
for (int i = 1; i <= n; ++i) {
M[i][0] = v[i];
}
for (int j = 1; (1 << j) <= n; ++j) {
for (int i = 0; (i + (1<<j) - 1) <= n; ++i) {
if (M[i][j-1] < M[i+(1<<(j-1))][j-1]) {
M[i][j] = M[i][j-1];
} else {
M[i][j] = M[i+(1<<(j-1))][j-1];
}
}
}
}
int main(void) {
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i) {
scanf("%d", &v[i]);
}
preprocess();
for (int i = 0; i < m; ++i) {
int x, y;
scanf("%d %d", &x, &y);
int k = l2(y - x);
printf("%d\n", MIN(M[x][k], M[y - (1<<k) + 1][k]));
}
return 0;
}