我只是…发个博客玩【捂脸】
#include <cstdio>
#include <queue>
//#include <algorithm>
//using namespace std;
#define INF 1000000000
#define N 510000
queue<int> q;
int n,m,root,tot=0;
int sum[N],ch[N][2],mx[N],lx[N],rx[N],size[N],v[N],fa[N],a[N],rev[N],post[N];
void update(int x){
int l=ch[x][0],r=ch[x][1];
sum[x]=sum[l]+sum[r]+v[x];
size[x]=size[l]+size[r]+1;
mx[x]=max(mx[l],mx[r]); mx[x]=max(mx[x],rx[l]+v[x]+lx[r]);
lx[x]=max(lx[l],sum[l]+v[x]+lx[r]);
rx[x]=max(rx[r],rx[l]+v[x]+sum[r]);
}
void pushdown(int x){
int l=ch[x][0],r=ch[x][1];
if(post[x]){
post[l]=1;post[r]=1;post[x]=0;rev[x]=0;
v[l]=v[x];v[r]=v[x];
sum[l]=v[x]*size[l];sum[r]=v[x]*size[r];
if(v[x]>0){
lx[l]=sum[l];rx[l]=sum[l];mx[l]=sum[l];
lx[r]=sum[r];rx[r]=sum[r];mx[r]=sum[r];
}
else{
lx[l]=0;rx[l]=0;mx[l]=v[x];
lx[r]=0;rx[r]=0;mx[r]=v[x];
}
}else if(rev[x]!=0){
rev[l]^=1;rev[r]^=1;rev[x]=0;
swap(ch[x][0],ch[x][1]);
swap(lx[l],rx[l]);swap(lx[r],rx[r]);
update(x);
}
}
void build(int l,int r,int f){
if(l>r) return;
int mid=(l+r)>>1,p;
if(q.empty()) p=++tot;
else{p=q.front();q.pop();}
v[p]=a[mid];fa[p]=f;post[p]=0;
if(l==r){
size[p]=1;ch[p][0]=0;ch[p][1]=0;mx[p]=a[mid];sum[p]=a[mid];
if(a[mid]>0){lx[p]=a[mid];rx[p]=a[mid];}
else {lx[p]=0;rx[p]=0;}
return;
}
if(l<=mid-1){
if(q.empty()) ch[p][0]=tot+1;
else ch[p][0]=q.front();
build(l,mid-1,p);
}
if(mid+1<=r){
if(q.empty()) ch[p][1]=tot+1;
else ch[p][1]=q.front();
build(mid+1,r,p);
}
update(p);
}
void rotate(int &x){
int y=fa[x],z=fa[y],t=(x==ch[y][0]);
if(z) ch[z][ch[z][1]==y]=x;
else root=x;
fa[x]=fa[y];fa[y]=x;fa[ch[x][t]]=y;
ch[y][t^1]=ch[x][t];ch[x][t]=y;
update(y);update(x);
}
void splay(int x,int &p){
while(x!=p){
int y=fa[x];
if(y==p){rotate(x);break;}
if((ch[y][0]==x)^(ch[fa[y]][0]==y)) rotate(x);
else rotate(y);
rotate(x);
}
}
int find(int x,int p){
pushdown(p);
if(size[ch[p][0]]+1==x) return p;
if(x<=size[ch[p][0]]) return find(x,ch[p][0]);
return find(x-size[ch[p][0]]-1,ch[p][1]);
}
void insert(int x,int p){
int y1=find(x,root),y2=find(x+1,root);
splay(y1,root);splay(y2,ch[y1][1]);
fa[p]=y2; ch[y2][0]=p;
update(y2);update(y1);
}
void rec(int x){
if(x==0) return;
rec(ch[x][0]);rec(ch[x][1]);
fa[x]=0;post[x]=0;rev[x]=0;q.push(x);
ch[x][0]=0;ch[x][1]=0;
}
void del(int xx,int yy){
int x=find(xx,root),y=find(yy,root);
splay(x,root);splay(y,ch[x][1]);
rec(ch[y][0]);ch[y][0]=0;
update(y);update(x);
}
void modify(int xx,int yy,int z){
int x=find(xx,root),y=find(yy,root);
splay(x,root);splay(y,ch[x][1]);
int t=ch[y][0];
post[t]=1;v[t]=z;sum[t]=z*size[t];
if(z>0){lx[t]=sum[t];rx[t]=sum[t];mx[t]=sum[t];}
else{lx[t]=0;rx[t]=0;mx[t]=z;}
update(y);update(x);
}
void reverse(int xx,int yy){
int x=find(xx,root),y=find(yy,root);
splay(x,root);splay(y,ch[x][1]);
rev[ch[y][0]]^=1;swap(lx[ch[y][0]],rx[ch[y][0]]);
update(y);update(x);
}
void query(int xx,int yy){
int x=find(xx,root),y=find(yy,root);
splay(x,root);splay(y,ch[x][1]);
printf("%d\n",sum[ch[y][0]]);
}
int main(){
freopen("sequence2.in","r",stdin);
freopen("sequence.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=2;i<=n+1;i++) scanf("%d",&a[i]);
a[1]=-INF;a[n+2]=-INF;mx[0]=-INF;
build(1,n+2,0);
root=1;
for(int i=1;i<=m;i++){
char str[20];int x,y;
scanf("%s",str);
if(str[2]=='S'){ //插入
scanf("%d%d",&x,&y);
for(int j=1;j<=y;j++) scanf("%d",&a[j]);
int z;
if(q.empty()) z=1+tot;
else z=q.front();
build(1,y,0);
insert(x+1,z);
}else if(str[2]=='L'){ //删除
scanf("%d%d",&x,&y);
del(x,x+y+1);
}else if(str[2]=='K'){ //修改
int z;
scanf("%d%d%d",&x,&y,&z);
modify(x,x+y+1,z);
}else if(str[2]=='V'){ //翻转
scanf("%d%d",&x,&y);
reverse(x,y+x+1);
}else if(str[2]=='T'){ //求和
scanf("%d%d",&x,&y);
query(x,x+y+1);
}else printf("%d\n",mx[root]); //求最大子串和
}
return 0;
}