核心思想:倍增
ST表是一个支持静态查询区间最大值的数据结构,预处理时间复杂度为 (O(nlogn)),(O(1)) 时间查询。
代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
inline int read(){
int x=0,f=1;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
return f*x;
}
int n,q,st[maxn][21],lg[maxn];
void read_and_parse(){
n=read(),q=read(),lg[0]=-1;
for(int i=1;i<=n;i++){
st[i][0]=read();
lg[i]=lg[i>>1]+1;
}
for(int j=1;j<=20;j++)
for(int i=1;i+(1<<j)-1<=n;i++)//注意范围,小心RE
st[i][j]=max(st[i][j-1],st[i+(1<<j-1)][j-1]);
}
int query(int l,int r){
int k=lg[r-l+1];
return max(st[l][k],st[r-(1<<k)+1][k]);
}
void solve(){
while(q--){
int l=read(),r=read();
printf("%d
",query(l,r));
}
}
int main(){
read_and_parse();
solve();
return 0;
}