RT,不太调得动这棵FHQ Treap 不知道哪错了,反正0pts没过样例,有实力的大佬可以帮忙捞一下
#include<bits/stdc++.h>
using namespace std;
struct Ty{int ls,rs,cmp,siz,val,tag1,tag2,ans,summ,ansl,ansr;}y[550005];
int Q[550005],cnt=1,root=0;
void pushup(Ty &u){
u.siz=y[u.ls].siz+y[u.rs].siz+1;
u.summ=y[u.ls].val+y[u.rs].val+u.val;
u.ansl=max(y[u.ls].ansl,y[u.rs].ansl+y[u.ls].summ);
u.ansr=max(y[u.rs].ansr,y[u.ls].ansr+y[u.rs].summ);
u.ans=max(y[u.ls].ansr+y[u.rs].ansl,max(y[u.ls].ans,y[u.rs].ans));
return;
}
void pushdown(Ty &u){
if(u.tag1<=1000){
y[u.ls].val=u.tag1;
y[u.rs].val=u.tag1;
y[u.ls].tag1=u.tag1;
y[u.rs].tag1=u.tag1;
y[u.ls].summ=u.tag1*y[u.ls].siz;
y[u.rs].summ=u.tag1*y[u.rs].siz;
if(u.tag1>0){
y[u.ls].ans=y[u.ls].ansl=y[u.ls].ansr=y[u.ls].summ;
y[u.rs].ans=y[u.rs].ansl=y[u.rs].ansr=y[u.rs].summ;
}
else{
y[u.ls].ans=y[u.ls].ansl=y[u.ls].ansr=0;
y[u.rs].ans=y[u.rs].ansl=y[u.rs].ansr=0;
}
u.tag1=1001;
}
if(u.tag2){
swap(y[u.ls].ls,y[u.ls].rs);
swap(y[u.rs].ls,y[u.rs].rs);
y[u.ls].tag2^=1;
y[u.rs].tag2^=1;
pushup(y[u.ls]);
pushup(y[u.rs]);
u.tag2=0;
}
}
int node(int val){
y[Q[cnt]].tag2=y[Q[cnt]].ls=y[Q[cnt]].rs=0;
y[Q[cnt]].cmp=rand();
y[Q[cnt]].val=y[Q[cnt]].summ=val;
y[Q[cnt]].siz=1;
y[Q[cnt]].tag1=1001;
if(val>0)y[Q[cnt]].ansl=y[Q[cnt]].ansr=y[Q[cnt]].ans=val;
else y[Q[cnt]].ansl=y[Q[cnt]].ansr=y[Q[cnt]].ans=0;
cnt++;
return Q[cnt-1];
}
void broke(int u,int val,int &a,int &b){
if(!u){
a=b=0;
return;
}
pushdown(y[u]);
if(y[y[u].ls].siz>=val)broke(y[u].ls,val,a,y[b=u].ls);
else broke(y[u].rs,val-y[y[u].ls].siz,y[a=u].rs,b);
pushup(y[u]);
return;
}
int mixed(int a,int b){
if(!a||!b)return a+b;
pushdown(y[a]);
pushdown(y[b]);
if(y[a].cmp>y[b].cmp){
y[a].rs=mixed(y[a].rs,b);
pushup(y[a]);
return a;
}
else{
y[b].ls=mixed(a,y[b].ls);
pushup(y[b]);
return b;
}
}
void insert(int id,int val){
int a,b;
broke(root,id,a,b);
root=mixed(mixed(a,node(val)),b);
return;
}
int query(int l,int r){
int a,b,c;
broke(root,l-1,a,b);
broke(b,r-l+1,b,c);
int ans=y[b].summ;
root=mixed(mixed(a,b),c);
return ans;
}
void recycle(int b){
if(!b)return;
Q[--cnt]=b;
recycle(y[b].ls);
recycle(y[b].rs);
return;
}
void del(int l,int r){
int a,b,c;
broke(root,l-1,a,b);
broke(b,r-l+1,b,c);
recycle(b);
root=mixed(a,c);
return;
}
void update1(int l,int r,int val){
int a,b,c;
broke(root,l-1,a,b);
broke(b,r-l+1,b,c);
y[b].val=val;
y[b].tag1=val;
y[b].summ=val*y[b].siz;
if(val>0)y[b].ans=y[b].ansl=y[b].ansr=y[b].summ;
else y[b].ans=y[b].ansl=y[b].ansr=0;
root=mixed(mixed(a,b),c);
return;
}
void update2(int l,int r){
int a,b,c;
broke(root,l-1,a,b);
broke(b,r-l+1,b,c);
swap(y[b].ls,y[b].rs);
y[b].tag2^=1;
pushup(y[b]);
root=mixed(mixed(a,b),c);
return;
}
signed main(){
for(int i=1;i<=550000;i++)Q[i]=i;
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
int a;
scanf("%d",&a);
insert(1,a);
}
for(int i=1;i<=m;i++){
string s;
cin>>s;
if(s=="INSERT"){
int add,l;
scanf("%d%d",&l,&add);
for(int j=1;j<=add;j++){
int a;
scanf("%d",&a);
insert(l,a);
l++;
}
}
if(s=="DELETE"){
int l,r;
scanf("%d%d",&l,&r);
del(l,l+r-1);
}
if(s=="MAKE-SAME"){
int l,r,val;
scanf("%d%d%d",&l,&r,&val);
update1(l,l+r-1,val);
}
if(s=="REVERSE"){
int l,r;
scanf("%d%d",&l,&r);
update2(l,l+r-1);
}
if(s=="GET-SUM"){
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",query(l,l+r-1));
}
if(s=="MAX-SUM")printf("%d\n",y[root].ans);
}
return 0;
}