Pagini recente » Cod sursa (job #2471644) | Cod sursa (job #533046) | Cod sursa (job #3040943) | Cod sursa (job #1790851) | Cod sursa (job #2484846)
#include <iostream>
#include <cstdio>
using namespace std;
int n, m;
int v[100005], r[17][100005], log[100005];
void gen_log() {
int lb = 1;
log[1] = 0;
for(int i = 2; i <= n; i++)
if(i == lb * 2) {
log[i] = log[lb] + 1;
lb *= 2;
}
else
log[i] = log[lb];
}
void gen_r() {
for(int i = 0; i <= log[n]; i++)
for(int j = 1; j + (1 << i) - 1 <= n; j++)
if(i == 0)
r[i][j] = v[j];
else
r[i][j] = min(r[i - 1][j], r[i - 1][j + (1 << (i - 1))]);
}
int get_min(int a, int b) {
int l = b - a + 1;
return min(r[log[l]][a], r[log[l]][b - (1 << log[l]) + 1]);
}
int main() {
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int x, y;
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++)
scanf("%d", &v[i]);
gen_log();
gen_r();
for(int i = 1; i <= m; i++) {
scanf("%d %d", &x, &y);
printf("%d\n", get_min(x, y));
}
return 0;
}