Pagini recente » Cod sursa (job #1497989) | Monitorul de evaluare | Cod sursa (job #893767) | Cod sursa (job #1081817) | Cod sursa (job #2395977)
#include <algorithm>
#include <stdio.h>
const int MAX_N = 100000;
int rmq[18][1 + MAX_N];
int lg[1 + MAX_N];
int main() {
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int n, Q;
scanf("%d%d", &n, &Q);
for (int i = 1; i <= n; i++)
scanf("%d", &rmq[0][i]);
lg[1] = 0;
for (int i = 2; i <= n; i++)
lg[i] = lg[i / 2] + 1;
for (int i = 1; (1 << i) <= n; i++)
for (int j = 1; j + (1 << i) - 1 <= n; j++) {
int size = 1 << (i - 1);
rmq[i][j] = std::min(rmq[i - 1][j], rmq[i - 1][j + size]);
}
for (int q = 1; q <= Q; q++) {
int x, y;
scanf("%d%d", &x, &y);
int size = y - x + 1;
int pow = lg[size];
size = size - (1 << pow);
printf("%d\n", std::min(rmq[pow][x], rmq[pow][x + size]));
}
return 0;
}