Get 到了全新 O(1) 替代部分伸展树功能的姿势

左栈 stk1 维护当前信息,右栈 stk2 维护历史删除信息

题目求的是严格的前缀和(且小于当前指针)那就每次左栈新增时再更新前缀和信息就好

即使把题面换成最大子段和也是一样搞法

要是 O(1) 求 1 到 k 的最大/小值?再来多一个维护历史的栈..应该可以吧

/*H E A D*/
stack<int> stk1,stk2;
ll sum[maxn],maxsum[maxn];
int main(){
    int Q,op,x,k;
    char str[50];
    while(~iin(Q)){
        while(!stk1.empty())stk1.pop();
        while(!stk2.empty())stk2.pop();
        memset(sum,0,sizeof sum);
        memset(maxsum,0x80,sizeof maxsum);
        rep(i,1,Q){
            s0(str);
            if(str[0]=='I'){
                x=read();
                stk1.push(x);
                int size=stk1.size();
                sum[size]=sum[size-1]+x;
                maxsum[size]=max(sum[size],maxsum[size-1]);
            }else if(str[0]=='D'){
                stk1.pop();
            }else if(str[0]=='L'){
                if(stk1.empty())continue;
                int t=stk1.top();
                stk2.push(t);
                stk1.pop();
            }else if(str[0]=='R'){
                if(stk2.empty())continue;
                int t=stk2.top();
                stk1.push(t);
                stk2.pop();
                int size=stk1.size();
                sum[size]=sum[size-1]+t;
                maxsum[size]=max(sum[size],maxsum[size-1]);
            }else{
                k=read();
                println(maxsum[k]);
            }
        }
    }
    return 0;
}