Pagini recente » Cod sursa (job #39829) | Cod sursa (job #337334) | Cod sursa (job #442283) | Cod sursa (job #1603722) | Cod sursa (job #1919805)
# 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++){
int l = 1 << (i-1);
rmq[i][j] = rmq[i-1][j];
if (rmq[i-1][j+1] < rmq[i][j])
rmq[i][j] = rmq[i-1][j+l];
}
}
}
void answer_queries(){
for (int i=1; i<=m; i++){
int x, y;
scanf("%d %d", &x, &y);
int max_dist = y - x + 1;
int log = lg[max_dist];
printf("%d\n", min(rmq[log][x], rmq[log][y - (1<<log) + 1]));
}
}
int main(){
read();
solve();
answer_queries();
return 0;
}