#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int inf = 1e9; const int N = 1e6+1; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n,m,root,cnt; int sum[N],size[N],v[N],mx[N],lx[N],rx[N],a[N],id[N],fa[N],son[N][2];; bool tag[N],rev[N]; queue<int>q; void pushdown(int x) { int sonl=son[x][0],sonr=son[x][1]; if(tag[x]) {
if(sonl)tag[sonl]=true,v[sonl]=v[x],sum[sonl]=v[x]*size[sonl]; if(sonr)tag[sonr]=true,v[sonr]=v[x],sum[sonr]=v[x]*size[sonr]; if(v[x]>=0) { if(sonl)lx[sonl]=rx[sonl]=mx[sonl]=sum[sonl]; if(sonr)lx[sonr]=rx[sonr]=mx[sonr]=sum[sonr]; } else { if(sonl)lx[sonl]=rx[sonl]=0,mx[sonl]=v[x]; if(sonr)lx[sonr]=rx[sonr]=0,mx[sonr]=v[x]; } rev[x]=tag[x]=0; } if(rev[x]) { rev[x]^=1;rev[sonl]^=1;rev[sonr]^=1; swap(lx[sonl],rx[sonl]);swap(lx[sonr],rx[sonr]); swap(son[sonl][0],son[sonl][1]);swap(son[sonr][0],son[sonr][1]); } } int inorder(int x) { pushdown(x); if(son[x][0])inorder(son[x][0]); if(v[x]!=inf&&v[x]!=-inf)printf("%d ",v[x]); if(son[x][1])inorder(son[x][1]); } void update(int x) { int sonl=son[x][0],sonr=son[x][1]; sum[x]=sum[sonl]+sum[sonr]+v[x]; size[x]=size[sonl]+size[sonr]+1; mx[x]=max(mx[sonl],mx[sonr]); mx[x]=max(mx[x],rx[sonl]+v[x]+lx[sonr]); lx[x]=max(lx[sonl],sum[sonl]+v[x]+lx[sonr]); rx[x]=max(rx[sonr],sum[sonr]+v[x]+rx[sonl]); }
void rotate(int x,int &k) { int y=fa[x],z=fa[y],l,r; l=(son[y][1]==x);r=l^1; if(y==k)k=x; else son[z][son[z][1]==y]=x; fa[son[x][r]]=y;fa[y]=x;fa[x]=z; son[y][l]=son[x][r];son[x][r]=y; update(y);update(x); } void splay(int x,int &k) { while(x!=k) { int y=fa[x],z=fa[y]; if(y!=k) { if(son[y][0]==x^son[z][0]==y)rotate(x,k); else rotate(y,k); } rotate(x,k); } } int find(int x,int rk) { pushdown(x); int l=son[x][0],r=son[x][1]; if(size[l]+1==rk)return x; if(size[l]>=rk)return find(l,rk); return find(r,rk-size[l]-1); } void rec(int x) { if(!x)return; int l=son[x][0],r=son[x][1]; rec(l);rec(r);q.push(x); fa[x]=son[x][0]=son[x][1]=0; tag[x]=rev[x]=0; } int split(int k,int tt) { int x=find(root,k),y=find(root,k+tt+1); splay(x,root);splay(y,son[x][1]); return son[y][0]; } void modify(int k,int tt,int val) { int x=split(k,tt),y=fa[x]; v[x]=val;tag[x]=1;sum[x]=size[x]*val; if(val>=0)lx[x]=rx[x]=mx[x]=sum[x]; else lx[x]=rx[x]=0,mx[x]=val; update(y);update(fa[y]); } void rever(int k,int tt) { int x=split(k,tt),y=fa[x]; if(!tag[x]) { rev[x]^=1; swap(son[x][0],son[x][1]); swap(lx[x],rx[x]); update(y);update(fa[y]); } } void delet(int k,int tt) { int x=split(k,tt),y=fa[x]; rec(x);son[y][0]=0; update(y);update(fa[y]); } void build(int l,int r,int s) { if(l>r)return; int mid=(l+r)>>1,now=id[mid],last=id[s]; if(l==r) { sum[now]=a[l];size[now]=1; tag[now]=rev[now]=0; if(a[l]>=0)lx[now]=rx[now]=mx[now]=a[l]; else lx[now]=rx[now]=0,mx[now]=a[l]; } else build(l,mid-1,mid),build(mid+1,r,mid); v[now]=a[mid];fa[now]=last;update(now); son[last][mid>=s]=now; } void insert(int k,int tt) { for(int i=1;i<=tt;i++)a[i]=read(); for(int i=1;i<=tt;i++) if(!q.empty())id[i]=q.front(),q.pop(); else id[i]=++cnt; build(1,tt,0);int z=id[(1+tt)>>1]; int x=find(root,k+1),y=find(root,k+2); splay(x,root);splay(y,son[x][1]); fa[z]=y;son[y][0]=z; update(y);update(x); } int main() {
scanf("%d%d",&n,&m); mx[0]=a[1]=a[n+2]=-inf; for(int i=2;i<=n+1;i++)a[i]=read(); for(int i=1;i<=n+2;i++)id[i]=i; build(1,n+2,0); root=(n+3)>>1;cnt=n+2; int k,tt,val; char op[19]; for(int i=1;i<=m;++i) { scanf("%s",op); if(op[0]=='I')k=read(),tt=read(),insert(k,tt); if(op[0]=='D')k=read(),tt=read(),delet(k,tt); if(op[0]=='M'&&op[2]=='X')printf("%d\n",mx[root]); if(op[0]=='M'&&op[2]=='K')k=read(),tt=read(),val=read(),modify(k,tt,val); if(op[0]=='R')k=read(),tt=read(),rever(k,tt); if(op[0]=='G'){k=read(),tt=read();printf("%d\n",sum[split(k,tt)]);} }
}
|