疑似插入出现问题,但是看不出来,WA on 3,TLE on 6
#include <bits/stdc++.h>
using namespace std;
inline int read(){
int s=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
f*=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
s=s*10+ch-'0';
ch=getchar();
}
return s*f;
}
inline void write(int x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9){
write(x/10);
}
putchar(x%10+'0');
}
const int MAXN=4e6+5;
stack<int> S;
int root=0,cnt=0,a[MAXN];
struct Node{
int val,sum,mxpre,mxsuf,mxsum,son[2],fa,lzu,rev,size;
}tr[MAXN];
inline int New(int val,int fa){
int t;
if(!S.empty()){
t=S.top();
S.pop();
if(!tr[t].son[0])S.push(tr[t].son[0]);
if(!tr[t].son[1])S.push(tr[t].son[1]);
}
else t=++cnt;
tr[t].val=val;
tr[t].sum=tr[t].mxsum=val;
tr[t].mxpre=tr[t].mxsuf=max(val,0);
tr[t].fa=fa;
tr[t].son[0]=tr[t].son[1]=0;
tr[t].rev=0;
tr[t].lzu=-10000;
tr[t].size=1;
return t;
}
inline void Mod(int k,int v){
tr[k].sum=tr[k].size*v;
tr[k].lzu=tr[k].val=v;
tr[k].mxpre=tr[k].mxsuf=max(tr[k].sum,0);
tr[k].mxsum=max(tr[k].sum,v);
}
inline void Rev(int k){
tr[k].rev^=1;
swap(tr[k].son[0],tr[k].son[1]);
swap(tr[k].mxpre,tr[k].mxsuf);
}
/*inline void upd(int k){
tr[k].sum=tr[k].mxpre=tr[k].mxsuf=tr[k].mxsum=tr[k].val;
tr[k].size=tr[tr[k].son[0]].size+tr[tr[k].son[1]].size+1;
if(tr[k].son[0]&&tr[tr[k].son[0]].val!=0xc0c0c0c0){
tr[k].mxsum=max(max(tr[k].mxsum,tr[tr[k].son[0]].mxsum),tr[tr[k].son[0]].mxsuf+tr[k].mxpre);
tr[k].mxpre=max(tr[tr[k].son[0]].mxpre,tr[tr[k].son[0]].sum+tr[k].mxpre);
tr[k].mxsuf=max(tr[k].mxsuf,tr[tr[k].son[0]].mxsuf+tr[k].sum);
tr[k].sum+=tr[tr[k].son[0]].sum;
}
if(tr[k].son[1]&&tr[tr[k].son[1]].val!=0xc0c0c0c0){
tr[k].mxsum=max(max(tr[k].mxsum,tr[tr[k].son[1]].mxsum),tr[k].mxsuf+tr[tr[k].son[1]].mxpre);
tr[k].mxpre=max(tr[k].mxpre,tr[k].sum+tr[tr[k].son[1]].mxpre);
tr[k].mxsuf=max(tr[tr[k].son[1]].mxsuf,tr[k].mxsuf+tr[tr[k].son[1]].sum);
tr[k].sum+=tr[tr[k].son[1]].sum;
}
}*/
inline void upd(int k){
int ls=tr[k].son[0],rs=tr[k].son[1];
tr[k].size=tr[ls].size+tr[rs].size+1;
tr[k].mxsum=max(max(tr[ls].mxsum,tr[rs].mxsum),tr[ls].mxsuf+tr[k].val+tr[rs].mxpre);
tr[k].mxpre=max(tr[ls].mxpre,tr[ls].sum+tr[k].val+tr[rs].mxpre);
tr[k].mxsuf=max(tr[rs].mxsuf,tr[ls].mxsuf+tr[k].val+tr[rs].sum);
tr[k].sum=tr[ls].sum+tr[rs].sum+tr[k].val;
}
inline void psd(int k){
if(tr[k].rev){
if(tr[k].son[0])Rev(tr[k].son[0]);
if(tr[k].son[1])Rev(tr[k].son[1]);
tr[k].rev=0;
}
if(tr[k].lzu!=-10000){
if(tr[k].son[0]){
Mod(tr[k].son[0],tr[k].lzu);
}
if(tr[k].son[1]){
Mod(tr[k].son[1],tr[k].lzu);
}
tr[k].lzu=-10000;
}
}
inline void RotFa(int x){
int y=tr[x].fa,z=tr[y].fa;
psd(y),psd(x);
int c=(tr[y].son[0]==x);
tr[y].son[!c]=tr[x].son[c];
tr[tr[x].son[c]].fa=y;
tr[x].son[c]=y;
tr[y].fa=x;
if(z){
tr[z].son[tr[z].son[1]==y]=x;
}
tr[x].fa=z;
upd(y),upd(x);
}
void Splay(int x,int goal){
while(tr[x].fa!=goal){
int y=tr[x].fa,z=tr[y].fa;
if(z!=goal){
(tr[y].son[0]==x)^(tr[z].son[0]==y)?RotFa(x):RotFa(y);
}
RotFa(x);
}
if(!goal)root=x;
}
int Build(int l,int r,int fa){
if(l>r)return 0;
int mid=(l+r)>>1;
int k=New(a[mid],fa);
tr[k].son[0]=Build(l,mid-1,k);
tr[k].son[1]=Build(mid+1,r,k);
upd(k);
return k;
}
int Find(int rk){
int k=root;
while(k){
psd(k);
if(tr[tr[k].son[0]].size>=rk){
k=tr[k].son[0];
continue;
}
if(tr[tr[k].son[0]].size+1>=rk){
return k;
}
rk-=(tr[tr[k].son[0]].size+1);
k=tr[k].son[1];
}
return 0;
}
void Print(int k){
if(!k){
return;
}
psd(k);
Print(tr[k].son[0]);
write(tr[k].val);
putchar(' ');
Print(tr[k].son[1]);
}
int main(){
//freopen("P2042_3.in","r",stdin);
//freopen("ans.out","w",stdout);
tr[0].size=tr[0].mxsuf=tr[0].mxpre=0;
tr[0].mxsum=0xc0c0c0c0;
int n=read(),m=read();
a[1]=0xc0c0c0c0;
for(int i=2;i<=n+1;i++){
a[i]=read();
}
a[n+2]=0xc0c0c0c0;
root=Build(1,n+2,root);
int L=Find(1),R=Find(n+2);
for(int i=1;i<=m;i++){
string s;
cin>>s;
if(s=="INSERT"){
int posi=read(),tot=read();
if(!tot)continue;
int x=Find(posi+1);
Splay(x,0);
int y=Find(posi+2);
Splay(y,x);
for(int j=1;j<=tot;j++){
a[j]=read();
}
tr[y].son[0]=Build(1,tot,y);
upd(y),upd(x);
Print(tr[y].son[0]);
putchar('\n');
}
else if(s=="DELETE"){
int posi=read(),tot=read();
if(!tot)continue;
int x=Find(posi);
Splay(x,0);
int y=Find(posi+tot+1);
Splay(y,x);
S.push(tr[y].son[0]);
tr[y].son[0]=0;
upd(y),upd(x);
Print(root);
putchar('\n');
}
else if(s=="MAKE-SAME"){
int posi=read(),tot=read();
if(!tot)continue;
int x=Find(posi);
Splay(x,0);
int y=Find(posi+tot+1);
Splay(y,x);
int v=read();
Mod(tr[y].son[0],v);
upd(y),upd(x);
//Print(root);
//putchar('\n');
}
else if(s=="REVERSE"){
int posi=read(),tot=read();
if(!tot)continue;
int x=Find(posi);
Splay(x,0);
int y=Find(posi+tot+1);
Splay(y,x);
Rev(tr[y].son[0]);
upd(y),upd(x);
//Print(root);
//putchar('\n');
}
else if(s=="GET-SUM"){
int posi=read(),tot=read();
if(!tot){
write(0);
putchar('\n');
continue;
}
int x=Find(posi);
Splay(x,0);
int y=Find(posi+tot+1);
Splay(y,x);
write(tr[tr[y].son[0]].sum);
putchar('\n');
}
else{
//Print(root);
//putchar('\n');
Splay(L,0);
Splay(R,L);
write(tr[tr[R].son[0]].mxsum);
putchar('\n');
}
}
return 0;
}