洛谷 P3865 【模板】ST表
ST 表模板。求静态区间最大值。
用 lg[n]
表示 ,预处理出该数组,然后用 st[i][j]
表示区间 的最大值,则存在递推关系:
预处理的时间复杂度:,查询一次的时间复杂度:,总时间复杂度:,其中 为查询次数。
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#define MAXN 100010
using namespace std;
int n,m,lg[MAXN],st[MAXN][20],l,r;
int main(){
#ifdef WINE
freopen("data.in","r",stdin);
#endif
scanf("%d%d",&n,&m);
lg[0]=-1;
for(int i=1;i<=n;i++){
scanf("%d",&st[i][0]);
lg[i]=((i&(i-1))==0)?lg[i-1]+1:lg[i-1];
}
for(int j=1;j<=lg[n];j++)
for(int i=1;i+(1<<j)-1<=n;i++)
st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
while(m--){
scanf("%d%d",&l,&r);
int k=lg[r-l+1];
printf("%d\n",max(st[l][k],st[r-(1<<k)+1][k]));
}
return 0;
}