st表
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
int main(){
//st graph
int n,m;
cin>>n>>m;
int len=(log2(n));
vector<vector<ll>>dp(n+1,vector<ll>(len+1));
for(int i=1;i<=n;i++) cin>>dp[i][0];//2的0次方长度为1
//dp[i][j] i起点 j次幂长度
//先枚举长度 再枚举起点
for(int j=1;j<=len;j++){
for(int i=1;i+(1<<j)-1<=n;i++){
dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
}
while(m--){
int a,b;
cin>>a>>b;
int k=log2(b-a+1);//区间长度向下取log
int ans=max(dp[a][k],dp[b-(1<<k)+1][k]);
cout<<ans<<endl;
}
return 0;
}

浙公网安备 33010602011771号