近几天第三次求调了。本人码力弱,喷轻点。
样例已过,交上去是0pts。调了两天,大概率是make_same的问题。可惜本人太蒻找不到。
//writer:Oier_szc
#include <bits/stdc++.h>
//#include <windows.h>
#define TS cerr<<"I AK IOI"<<endl;
#define cr(x) cerr<<x<<endl;
#define cr2(x,y) cerr<<x<<" "<<y<<endl;
#define cr3(x,y,z) cerr<<x<<" "<<y<<" "<<z<<endl;
//#define int long long
using namespace std;
const int N=1e6+5,INF=2e9;
int n,m;
struct node
{
int l,r;
int key,val,siz;
int same,rev;
int ans,sum,ls,rs;
}tr[N];
int root=0,idx=0;
int nodes[N],top=0;
int w[N];
int get_node(int key)
{
node &u=tr[nodes[top--]];
u.l=u.r=u.rev=0;
u.same=INF;
u.val=rand();
u.siz=1;
u.key=u.sum=u.ans=key;
u.ls=u.rs=max(key,0);
return nodes[top+1];
}
void pushup(node &p)
{
node &l=tr[p.l],&r=tr[p.r];
p.siz=l.siz+r.siz+1;
p.sum=l.sum+r.sum+p.key;
p.ans=max(max(l.ans,r.ans),l.rs+r.ls+p.key);
p.ls=max(l.ls,l.sum+r.ls+p.key);
p.rs=max(r.rs,r.sum+l.rs+p.key);
}
void Same(int p,int c)
{
if(!p) return;
tr[p].val=tr[p].same=c;
tr[p].sum=c*tr[p].siz;
tr[p].ls=tr[p].rs=max(tr[p].sum,0);
tr[p].ans=max(tr[p].sum,c);
tr[p].rev=0;
}
void Rev(int p)
{
if(!p) return;
swap(tr[p].ls,tr[p].rs);
swap(tr[p].l,tr[p].r);
tr[p].rev^=1;
}
void pushdown(node &p)
{
if(p.same!=INF)
{
TS
Same(p.l,p.same),Same(p.r,p.same);
p.same=INF;
}
if(p.rev)
{
Rev(p.l),Rev(p.r);
p.rev=0;
}
}
void split(int p,int key,int &x,int &y)
{
if(!p) x=y=0;
else
{
pushdown(tr[p]);
if(tr[tr[p].l].siz+1<=key) x=p,split(tr[p].r,key-tr[tr[p].l].siz-1,tr[p].r,y);
else y=p,split(tr[p].l,key,x,tr[p].l);
pushup(tr[p]);
}
}
int merge(int x,int y)
{
if(!x||!y) return x|y;
if(tr[x].val<tr[y].val)
{
pushdown(tr[x]);
tr[x].r=merge(tr[x].r,y),pushup(tr[x]);
return x;
}
else
{
pushdown(tr[y]);
tr[y].l=merge(x,tr[y].l),pushup(tr[y]);
return y;
}
}
void dfs(int p)
{
if(tr[p].l) dfs(tr[p].l);
if(tr[p].r) dfs(tr[p].r);
nodes[++top]=p;
}
/*void print1(int p)
{
if(tr[p].l) print1(tr[p].l);
printf("%d ",p);
if(tr[p].r) print1(tr[p].r);
}
void print2(int p)
{
printf("%d ",p);
if(tr[p].l) print2(tr[p].l);
if(tr[p].r) print2(tr[p].r);
}*/
int main()
{
tr[0].ans=-INF;
for(int i=N-1;i>=1;--i) nodes[++top]=i;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
{
scanf("%d",&w[i]);
root=merge(root,get_node(w[i]));
}
char op[12];
int pos,tot,c;
int x,y,z;
while(m--)
{
scanf("%s",op);
if(op[0]=='I')
{
scanf("%d%d",&pos,&tot);
split(root,pos,x,y);
for(int i=1;i<=tot;++i)
{
scanf("%d",&w[i]);
x=merge(x,get_node(w[i]));
}
root=merge(x,y);
}
else if(op[0]=='D')
{
scanf("%d%d",&pos,&tot);
split(root,pos+tot-1,x,y);
split(x,pos-1,x,z);
dfs(z);
root=merge(x,y);
}
else if(op[2]=='K')
{
scanf("%d%d%d",&pos,&tot,&c);
//continue;
split(root,pos+tot-1,x,y);
split(x,pos-1,x,z);
Same(z,c);
root=merge(merge(x,z),y);
}
else if(op[0]=='R')
{
scanf("%d%d",&pos,&tot);
split(root,pos+tot-1,x,y);
split(x,pos-1,x,z);
Rev(z);
root=merge(merge(x,z),y);
//TS
}
else if(op[0]=='G')
{
scanf("%d%d",&pos,&tot);
split(root,pos+tot-1,x,y);
split(x,pos-1,x,z);
printf("%d\n",tr[z].sum);
root=merge(merge(x,z),y);
}
else if(op[2]=='X')
{
printf("%d\n",tr[root].ans);
}
//printf("%d\n",tr[root].ans);
/*print1(root);
printf("\n");
print2(root);
printf("\n");*/
}
return 0;
}
/*
9 8
2 -6 3 5 1 -5 -3 6 3
GET-SUM 5 4
MAX-SUM
INSERT 0 3 -5 7 2
DELETE 12 1
MAKE-SAME 3 3 2
REVERSE 3 6
GET-SUM 5 4
MAX-SUM
*/