Pagini recente » Cod sursa (job #3162820) | Cod sursa (job #1394431) | Cod sursa (job #2538295) | Cod sursa (job #2325956) | Cod sursa (job #1919777)
# include <cstdio>
# include <algorithm>
using namespace std;
FILE *f = freopen("rmq.in", "r", stdin);
FILE *g = freopen("rmq.out", "w", stdout);
const int N_MAX = 100010;
int v[N_MAX];
int rmq[20][N_MAX]; /// maximul de la j la j + 2^i - 1
int lg[N_MAX];
int n, m;
void read(){
scanf("%d %d", &n, &m);
for (int i=1; i<=n; i++){
scanf("%d", &v[i]);
rmq[0][i] = v[i];
}
}
void solve(){
lg[2] = 1;
for (int i=3; 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++){
rmq[i][j] = rmq[i-1][j];
if (rmq[i-1][j+1] < rmq[i][j])
rmq[i][j] = rmq[i-1][j+1];
}
}
}
void answer_queries(){
for (int i=1; i<=m; i++){
int x, y;
scanf("%d %d", &x, &y);
int max_dist = y - x;
int log = lg[max_dist];
printf("%d\n", min(rmq[log][x], rmq[log][x + (1<<(log - 1))]));
}
}
int main(){
read();
solve();
answer_queries();
return 0;
}