ST表本身是不可修改的。
如果考虑增加一个数,可以把ST表反过来写,即f[i][j]表示i往前1<<j个数,一个数最多影响logn个数,常数非常小。
#include<iostream> #include<cstdio> #include<cmath> using namespace std; const int MAXN=200005; typedef long long ll; inline ll rd(){ ll ret=0,f=1;char c; while(c=getchar(),!isdigit(c))f=c=='-'?-1:1; while(isdigit(c))ret=ret*10+c-'0',c=getchar(); return ret*f; } ll f[MAXN][32]; ll m,mod; int p; int main(){ m=rd();mod=rd(); char s[5];ll x,t=0; while(m--){ scanf("%s",s);x=rd(); if(s[0]=='Q') { int len=log2(x); printf("%lld ",t=max(f[p][len],f[p-x+(1<<len)][len])%mod); }else{ f[++p][0]=(x+t)%mod; for(int i=1;p-(1<<i)>=0;i++) f[p][i]=max(f[p][i-1],f[p-(1<<(i-1))][i-1]); } } return 0; }