Pagini recente » Cod sursa (job #1480595) | Cod sursa (job #2717288) | Cod sursa (job #387132) | Cod sursa (job #2523738) | Cod sursa (job #2284030)
#include <stdio.h>
#include <math.h>
const int NMAX = 100000;
const int LOGN = 20;
int N, M;
int dp[NMAX][LOGN];
int vec[NMAX];
int lg[LOGN + 2];
int main() {
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d%d",&N,&M);
for (int i = 0; i < N; ++i) {
scanf("%d",&vec[i]);
}
lg[1] = 0;
for (int i = 2; i <= N; ++i) {
lg[i] = lg[i/2] + 1;
}
for (int i = 0; i <= N; ++i) {
for (int j = 0; j <= lg[N]; ++j) {
dp[i][j] = NMAX + 10;
}
}
for (int i = 0; i < N; ++i) {
dp[i][0] = vec[i];
}
for (int j = 1; (1 << j) <= N; j++) {
int sh = (1 << (j-1));
for (int i = 0; i + (1 << j) - 1 < N; ++i) {
if (dp[i][j-1] <= dp[i+sh][j-1]) {
dp[i][j] = dp[i][j-1];
} else {
dp[i][j] = dp[i+sh][j-1];
}
}
}
//for (int i = 0; i < N; ++i) {
//for (int j = 0; j < LOGN; ++j) {
//printf("%d ",dp[i][j]);
//}
//printf("\n");
//}
for (int i = 0; i < M; ++i) {
int n1, n2;
scanf("%d%d",&n1, &n2);
n1--; n2--;
int k = lg[n2-n1 + 1];
int val = 0;
if (dp[n1][k] < dp[n2 - (1 << k)+1][k]) {
val = dp[n1][k];
} else {
val = dp[n2 - (1 << k)+1][k];
}
printf("%d\n", val);
}
fclose(stdin);
fclose(stdout);
return 0;
}