st表——RMQ 问题
st表——RMQ 问题
(一本通)1541:【例 1】数列区间最大值
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0);cout.tie(0);cin.tie(0);
#define endl '\n'
#define int long long
int num[100001];
int maxn[100001][21];
int n,m;
int lg[100010];
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=2;i<=n;i++)lg[i]=lg[i>>1]+1;//log(10,x)预处理
for(int i=1;i<=n;i++){//输入
scanf("%lld",&num[i]);
maxn[i][0]=num[i];
}
for(int i=1;1<<i<=n;i++){//st处理
int logg=1<<i;
for(int j=1;j+logg-1<=n;j++){
maxn[j][i]=max(maxn[j][i-1],maxn[j+logg/2][i-1]);
}
}
for(int i=1;i<=m;i++){//查询
int l,r;
scanf("%lld%lld",&l,&r);
if(l==r){
printf("%lld\n",num[l]);
continue;
}
else{
int len=r-l+1;
int logg=lg[len];
int loggnum=1<<logg;
int maxnum=max(maxn[l][logg],maxn[r-loggnum+1][logg]);
printf("%lld\n",maxnum);
}
}
return 0;
}

浙公网安备 33010602011771号