#10119. 「一本通 4.2 例 1」数列区间最大值(题目链接)
RMQ板子题
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+500;
int mp[maxn];
int mx[maxn][31];
int n,m;
void ini(){
for(int i=0;i<log(n)/log(2);++i){
for(int j=0;j<n;++j){
if(i){
mx[j][i] = max(mx[j][i],mx[j][i-1]);
if(j+(1<<(i-1))<n) mx[j][i] = max(mx[j][i],mx[j+(1<<(i-1))][i-1]);
}
else mx[j][i] = mp[j];
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i) scanf("%d",&mp[i]);
memset(mx,-122,sizeof(mx));
ini();
int a,b;
while(m--){
scanf("%d%d",&a,&b);
int mid = log(b-a+1)/log(2);
printf("%d\n",max(mx[a-1][mid],mx[b-(1<<mid)][mid]));
}
return 0;
}