Pagini recente » Cod sursa (job #1107748) | Cod sursa (job #901866) | Cod sursa (job #1872964) | Cod sursa (job #152302) | Cod sursa (job #1547656)
#include <cstdio>
#include <algorithm>
using std :: min;
const int maxN = 100000;
int v[maxN];
int rmq[20][maxN];
int Log[1 + maxN];
int rmQuery(int x, int y) {
int l = y - x + 1;
int step = Log[l];
return min(rmq[step][x], rmq[step][y - (1 << step) + 1]);
}
void rmqCompute(int v[], int N) {
for(int i = 0; i < N; ++ i)
rmq[0][i] = v[i];
for(int i = 1; (1 << i) <= N; ++ i)
Log[(1 << i)] = 1;
for(int i = 1; i <= N; ++ i)
Log[i] += Log[i - 1];
int p = 2;
for(int step = 1; p <= N; ++ step, p <<= 1) {
int put = p >> 1;
for(int i = 0; i + put < N; ++ i)
rmq[step][i] = min(rmq[step - 1][i], rmq[step - 1][i + put]);
}
}
int main() {
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int N, T;
scanf("%d %d", &N, &T);
for(int i = 0; i < N; ++ i)
scanf("%d", &v[i]);
rmqCompute(v, N);
int x, y;
while(T --) {
scanf("%d %d", &x, &y);
printf("%d\n", rmQuery(x - 1, y - 1));
}
return 0;
}