Pagini recente » Cod sursa (job #2237473) | Cod sursa (job #518614) | Cod sursa (job #1321875) | Cod sursa (job #2560419) | Cod sursa (job #1106700)
#include <cstdio>
using namespace std;
int N, M;
int v[100000];
int r[20][100000];
int log2(int n) {
int p = 1, l = 0;
while(p <= n) {
p *= 2;
l++;
}
return l - 1;
}
int min(int a, int b) {
if(a < b) return a;
return b;
}
void preprocess_rmq() {
for(int i = 0; i < N; ++i) {
r[0][i] = v[i];
}
int l = log2(N);
for(int k = 1; k <= l; ++k) {
for(int i = 0; i <= N - (1 << k); ++i) {
int offset = (1 << (k - 1));
r[k][i] = min(r[k - 1][i], r[k - 1][i + offset]);
}
}
}
int solve(int a, int b) {
a--, b--;
int k = log2(b - a + 1);
int res = min(r[k][a], r[k][b - (1 << k) + 1]);
return res;
}
int main(int argc, char *argv[]) {
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d%d", &N, &M);
for(int i = 0; i < N; ++i) {
scanf("%d", v + i);
}
preprocess_rmq();
for(int i = 0; i < M; ++i) {
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", solve(a, b));
}
return 0;
}