RT,仅 AC 测试点 1,3,4,9。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
#include<unordered_map>
#include<vector>
#include<queue>
#include<bitset>
#include<set>
#include<ctime>
#include<random>
#define x1 xx1
#define y1 yy1
#define IOS ios::sync_with_stdio(false)
#define ITIE cin.tie(0);
#define OTIE cout.tie(0);
#define PY puts("Yes")
#define PN puts("No")
#define PW puts("-1")
#define popcount __builtin_popcount
using namespace std;
inline int R(){
int x=0,f=1;int ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}return x*f;
}
inline void write(int x){
if(x<0){x=-x;putchar('-');}
int y=0;char z[70];
while(x||!y){z[y++]=x%10+48;x/=10;}
while(y--)putchar(z[y]);
}
inline void writesp(int x){
write(x);putchar(32);
}
inline void writeln(int x){
write(x);putchar(10);
}
#define pii pair<int,int>
#define mp make_pair
#define fi first
#define se second
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define per(a,b,c) for(int a=b;a>=c;a--)
#define reprange(a,b,c,d) for(int a=b;a<=c;a+=d)
#define perrange(a,b,c,d) for(int a=b;a>=c;a-=d)
#define graph(i,j,k,l) for(int i=k[j];i;i=l[i].nxt)
const int maxn=5e5+5,V=1e3+1,VV=0x3f3f3f3f;
int n,q,c[maxn];
struct node{
int ch[2],fa,siz,val;//这是信息
int sum,ans,preans,secans;//这是答案
int tagrev,tagsum;//这是标记
node(){ans=-VV;}
}a[maxn];
queue<int>id;
int rt,cnt;
int lowinf,uppinf;
bool getson(int p){
return p==a[a[p].fa].ch[1];
}
void pushup(int p){
a[p].siz=a[a[p].ch[0]].siz+a[a[p].ch[1]].siz+1;
a[p].sum=a[a[p].ch[0]].sum+a[a[p].ch[1]].sum+a[p].val;
a[p].preans=max(a[a[p].ch[0]].preans,a[a[p].ch[0]].sum+a[p].val+a[a[p].ch[1]].preans);
a[p].secans=max(a[a[p].ch[1]].secans,a[a[p].ch[1]].sum+a[p].val+a[a[p].ch[0]].secans);
a[p].ans=max(max(a[a[p].ch[0]].ans,a[a[p].ch[1]].ans),a[a[p].ch[0]].secans+a[p].val+a[a[p].ch[1]].preans);
}
void Modify(int p,int x){
a[p].val=x,a[p].sum=x*a[p].siz,a[p].tagsum=x;
if(x>=0) a[p].preans=a[p].secans=a[p].ans=x*a[p].siz;
else a[p].preans=a[p].secans=0,a[p].ans=x;
}
void Modify_Reverse(int p){
a[p].tagrev^=1;
swap(a[p].preans,a[p].secans);
swap(a[p].ch[0],a[p].ch[1]);
}
void pushdown(int p){
if(p&&a[p].tagsum){
if(a[p].ch[0]) Modify(a[p].ch[0],a[p].tagsum);
if(a[p].ch[1]) Modify(a[p].ch[1],a[p].tagsum);
a[p].tagsum=a[p].tagrev=0;
}
if(p&&a[p].tagrev){
if(a[p].ch[0]) Modify_Reverse(a[p].ch[0]);
if(a[p].ch[1]) Modify_Reverse(a[p].ch[1]);
a[p].tagrev=0;
}
}
void rotate(int x){
int y=a[x].fa,z=a[y].fa;
// pushdown(y),pushdown(x);
int sn=getson(x),sn1=getson(y);
int t=a[x].ch[sn^1];
a[x].fa=z,a[y].fa=x;
if(t) a[t].fa=y;
if(z) a[z].ch[sn1]=x;
a[x].ch[sn^1]=y,a[y].ch[sn]=t;
pushup(y),pushup(x);
}
void splay(int p,int tar){
while(a[p].fa!=tar){
int x=a[a[p].fa].fa;
if(x!=tar) rotate(getson(a[p].fa)==getson(p)?a[p].fa:p);
rotate(p);
}
if(!tar) rt=p;
}
void kill(int p){
a[p].ch[0]=a[p].ch[1]=a[p].fa=a[p].val=a[p].siz=0;
a[p].sum=a[p].tagrev=a[p].tagsum=a[p].preans=a[p].secans=0;
a[p].ans=-VV;
}
int build(int l,int r,int fa){
if(l>r) return 0;
int mid=l+r>>1;
int p=id.front();id.pop();
if(c[mid]==V) uppinf=p;
if(c[mid]==-V) lowinf=p;
kill(p);
a[p].fa=fa,a[p].val=c[mid];
a[p].ch[0]=build(l,mid-1,p);
a[p].ch[1]=build(mid+1,r,p);
pushup(p);
return p;
}
int kth(int k){
int nw=rt;
while(nw&&k){
pushdown(nw);
if(k<=a[a[nw].ch[0]].siz) nw=a[nw].ch[0];
else if(k==a[a[nw].ch[0]].siz+1) return nw;
else k-=a[a[nw].ch[0]].siz+1,nw=a[nw].ch[1];
}
}
void insert(int x,int k){
int pp=kth(x+1),p=kth(x+2);
splay(pp,0);splay(p,pp);
int u=build(1,k,p);
a[p].ch[0]=u;
splay(p,0);
}
void destroy(int p){
if(!p) return;
destroy(a[p].ch[0]);
destroy(a[p].ch[1]);
kill(p);id.push(p);
}
void Delete(int l,int r){
int ll=kth(l),rr=kth(r+2);
splay(ll,0);splay(rr,ll);
destroy(a[rr].ch[0]);
a[rr].ch[0]=0;
splay(rr,0);
}
void makesame(int l,int r,int k){
int ll=kth(l),rr=kth(r+2);
splay(ll,0);splay(rr,ll);
int nw=a[rr].ch[0];
Modify(nw,k);
splay(rr,0);
}
void reverse(int l,int r){
int ll=kth(l),rr=kth(r+2);
splay(ll,0);splay(rr,ll);
if(a[a[rr].ch[0]].tagsum) return;
Modify_Reverse(a[rr].ch[0]);
splay(rr,0);
}
int main(){
n=R(),q=R();rep(i,1,500002)id.push(i);
rep(i,1,n)c[i+1]=R();c[1]=-V,c[n+2]=V;
rt=build(1,n+2,0);
rep(_,1,q){
string op;int x,y,k;
cin>>op;
if(op=="INSERT"){
x=R(),k=R();rep(i,1,k)c[i]=R();
insert(x,k);
}else if(op=="DELETE"){
x=R(),y=R();
Delete(x,x+y-1);
}else if(op=="MAKE-SAME"){
x=R(),y=R(),k=R();
makesame(x,x+y-1,k);
}else if(op=="REVERSE"){
x=R(),y=R();
reverse(x,x+y-1);
}else if(op=="GET-SUM"){
x=R(),y=R();
int tmp=x;
x=kth(x),y=kth(tmp+y+1);
splay(x,0);splay(y,x);
writeln(a[a[y].ch[0]].sum);
}else if(op=="MAX-SUM"){
splay(lowinf,0);splay(uppinf,lowinf);
writeln(a[a[uppinf].ch[0]].ans);
}
}
}