rt,初步推断为答案会随着树的形态发生改变
code:
#include<bits/stdc++.h>
using namespace std;
int n,q,tot,rt,del[5000005],cnt,a[5000005],k,pos,val,x,y;
string op;
mt19937 gen(random_device{}());
uniform_int_distribution<int>rng(1,0x3f3f3f3f);
struct node{
int val,siz,lc,rc,rnk,rev,cov,sum,mx,lmx,rmx;
}t[5000005];
void update(int cur){
t[cur].siz=t[t[cur].lc].siz+t[t[cur].rc].siz+1,
t[cur].sum=t[t[cur].lc].sum+t[t[cur].rc].sum+t[cur].val,
t[cur].mx=max(t[t[cur].lc].rmx+t[t[cur].rc].lmx,0)+t[cur].val,
t[cur].lmx=max(max(t[t[cur].lc].lmx,t[t[cur].lc].sum+t[cur].val+t[t[cur].rc].lmx),0),
t[cur].rmx=max(max(t[t[cur].rc].rmx,t[t[cur].rc].sum+t[cur].val+t[t[cur].lc].rmx),0);
if(t[cur].lc)
t[cur].mx=max(t[cur].mx,t[t[cur].lc].mx);
if(t[cur].rc)
t[cur].mx=max(t[cur].mx,t[t[cur].rc].mx);
}
int add(int val){
int id=(cnt?del[cnt--]:++tot);
node ret=(node){val,1,0,0,rng(gen),0,0,val,val,max(val,0),max(val,0)};
t[id]=ret;
return id;
}
void cover(int cur,int val){
t[cur].val=val,t[cur].cov=1,t[cur].sum=val*t[cur].siz,t[cur].mx=max(t[cur].sum,val),t[cur].lmx=t[cur].rmx=max(0,t[cur].sum);
}
void reverse(int cur){
t[cur].rev=1,swap(t[cur].lc,t[cur].rc),swap(t[cur].lmx,t[cur].rmx);
}
void pushdown(int cur){
if(t[cur].cov){
if(t[cur].lc)
cover(t[cur].lc,t[cur].val);
if(t[cur].rc)
cover(t[cur].rc,t[cur].val);
t[cur].cov=0;
}
if(t[cur].rev){
if(t[cur].lc)
reverse(t[cur].lc);
if(t[cur].rc)
reverse(t[cur].rc);
t[cur].rev=0;
}
}
void split(int cur,int &a,int &b,int val){
if(!cur){
a=b=0;
return;
}
pushdown(cur);
if(t[t[cur].lc].siz+1<=val)
a=cur,split(t[cur].rc,t[cur].rc,b,val-t[t[cur].lc].siz-1);
else
b=cur,split(t[cur].lc,a,t[cur].lc,val);
update(cur);
}
void merge(int &cur,int a,int b){
if(!a||!b){
cur=a+b;
return;
}
if(t[a].rnk<t[b].rnk)
pushdown(a),cur=a,merge(t[cur].rc,t[cur].rc,b);
else
pushdown(b),cur=b,merge(t[cur].lc,a,t[cur].lc);
update(cur);
}
int build(int l,int r){
if(l==r)
return add(a[l]);
int mid=(l+r)>>1,cur=0;
merge(cur,build(l,mid),build(mid+1,r));
return cur;
}
void insert(int &cur,int val){
int a=0,b=0,p=add(val);
split(cur,a,b,val),merge(a,a,p),merge(cur,a,b);
}
void remove(int cur){
del[++cnt]=cur;
if(t[cur].lc)
remove(t[cur].lc);
if(t[cur].rc)
remove(t[cur].rc);
}
void print(int cur){
pushdown(cur);
if(t[cur].lc)
print(t[cur].lc);
cout<<t[cur].val<<' ';
if(t[cur].rc)
print(t[cur].rc);
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0),cin>>n>>q;
for(int i=1;i<=n;i++)
cin>>a[i];
rt=build(1,n);
while(q--){
cin>>op;
if(op=="INSERT"){
cin>>pos>>k,split(rt,rt,x,pos);
for(int i=1;i<=k;i++)
cin>>a[i];
merge(rt,rt,build(1,k)),merge(rt,rt,x);
}
else if(op=="DELETE")
cin>>pos>>k,split(rt,x,rt,pos-1),split(rt,rt,y,k),remove(rt),merge(rt,x,y);
else if(op=="MAKE-SAME")
cin>>pos>>k>>val,split(rt,x,rt,pos-1),split(rt,rt,y,k),cover(rt,val),merge(rt,rt,y),merge(rt,x,rt);
else if(op=="REVERSE")
cin>>pos>>k,split(rt,x,rt,pos-1),split(rt,rt,y,k),reverse(rt),merge(rt,rt,y),merge(rt,x,rt);
else if(op=="GET-SUM")
cin>>pos>>k,split(rt,x,rt,pos-1),split(rt,rt,y,k),cout<<t[rt].sum<<'\n',merge(rt,rt,y),merge(rt,x,rt);
else
cout<<t[rt].mx<<'\n';
}
return 0;
}