st表
1.luogu 1198 最大数
逆序st表,专用于取最大值,递推log
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=200050; const int Logn=25; inline ll read(){ ll x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} return x*f;} ll a[N],f[N][Logn],lg[N]; ll n,m,x,l,ans,t,D; char ch; void change(ll u){ f[u][0]=a[u]; for(ll i=1;(1<<i)<=u;i++) f[u][i]=max(f[u][i-1],f[u-(1<<(i-1))][i-1]);} ll find(ll x,ll y){ ll s=lg[y-x+1]; return max(f[y][s],f[x+(1<<s)-1][s]);} int main(){ lg[0]=-1; scanf("%d%lld",&m,&D); for (ll i=1;i<=m;i++){ char ch;cin>>ch; if(ch=='A'){ x=read(); a[++n]=(x+t)%D; lg[n]=lg[n>>1]+1; change(n); }else if(ch=='Q'){ l=read(); if(l==1){ printf("%lld\n",a[n]); t=a[n];continue;} ans=find(n-l+1,n); printf("%lld\n",ans);t=ans; } } return 0; }
模板
#include<bits/stdc++.h> using namespace std; const int Logn=20; const int N=1e6+5; int lg[N],f[N][Logn+5],a[N],n,m; int main(){ int n,m;cin>>n>>m; lg[0]=-1; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) f[i][0]=a[i],lg[i]=lg[i>>1]+1; for(int j=1;j<=Logn;j++) for(int i=1;i+(1<<j)-1<=n;i++) f[i][j]=max(f[i][j-1],f[i+(1<<j-1)][j-1]); while(m--){ int x,y; cin>>x>>y; int s=lg[y-x+1]; printf("%d\n",max(f[x][s],f[y-(1<<s)+1][s])); }return 0; }