[模板] 动态ST表

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;
}

本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9291670.html

原文地址:https://www.cnblogs.com/ghostcai/p/9291670.html