1500

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define ll long long
#define splay spaly
using namespace std;
int n,m,sta[533333],top,v[533333],root,sum[533333],tot,r,a1,sam[533333],lazy[533333],w[533333],fa[535333],in[533333],dd[533333],son[533333][2],l,a2,ma[533333],la[533333],ra[533333];
char ss[111];
void down(int k)
{
	int t;
	if(lazy[k])
	{
		lazy[k]%=2;
		if(lazy[k])
		{
			int t1=son[k][0];
			son[k][0]=son[k][1];
			son[k][1]=t1;
			lazy[k]=0;
			lazy[son[k][0]]++;
			lazy[son[k][1]]++;
			swap(la[k],ra[k]);
		}
	}
	if(sam[k])
	{
		t=sam[k]==10086?0:sam[k];
		v[k]=t;
		if(t>=0)
		sum[k]=la[k]=ma[k]=ra[k]=w[k]*t;
		else
		{
			sum[k]=w[k]*t;
			la[k]=ma[k]=ra[k]=t;
		}			
		sam[son[k][1]]=sam[k];
		sam[son[k][0]]=sam[k];
		sam[k]=0;	
	}
}
void cmp(int k)
{
	if(lazy[son[k][1]]||sam[son[k][1]])
	down(son[k][1]);
	if(lazy[son[k][0]]||sam[son[k][0]])
	down(son[k][0]);
	w[k]=w[son[k][1]]+w[son[k][0]]+1;
	sum[k]=sum[son[k][0]]+sum[son[k][1]]+v[k];
	if(!son[k][0])
	{
		if(!son[k][1])
		{
			la[k]=ra[k]=ma[k]=v[k];
		}
		else
		{
			la[k]=max(v[k],v[k]+la[son[k][1]]);
			ra[k]=max(ra[son[k][1]],sum[k]);
			ma[k]=max(ma[son[k][1]],max(la[k],ra[k]));
		}
	}
	else
	{
		if(!son[k][1])
		{
			la[k]=max(la[son[k][0]],sum[k]);
			ra[k]=max(v[k],v[k]+ra[son[k][0]]);
			ma[k]=max(ma[son[k][0]],max(la[k],ra[k]));
		}
		else
		{
			la[k]=max(la[son[k][0]],max(sum[son[k][0]]+v[k],sum[son[k][0]]+v[k]+la[son[k][1]]));
			ra[k]=max(ra[son[k][1]],max(sum[son[k][1]]+v[k],sum[son[k][1]]+v[k]+ra[son[k][0]]));
			ma[k]=max(v[k],max(ma[son[k][0]],max(ma[son[k][1]],max(ra[son[k][0]]+v[k],max(la[son[k][1]]+v[k],la[son[k][1]]+v[k]+ra[son[k][0]])))));
		}
	}
}
void ins(int l,int r,int f,int u)
{
	if(l>r)
	return;
	int k=(l+r)/2;
	v[dd[k]]=in[k];
	fa[dd[k]]=dd[f];
	son[dd[f]][u]=dd[k];
	ins(l,k-1,k,0);
	ins(k+1,r,k,1);
	cmp(dd[k]);
}
void zuan(int k)
{
	int f=fa[k],grf=fa[f],zy=son[f][1]==k,so=son[k][!zy];
	if(grf)
	son[grf][son[grf][1]==f]=k;
	fa[k]=grf;	
	fa[f]=k;
	son[k][!zy]=f;	
	fa[so]=f;
	son[f][zy]=so;	
	cmp(f);
	cmp(k);
}
void splay(int k)
{
	while(fa[k])
	{
		int f=fa[k],grf=fa[f];
		if(grf)
		{
			if((son[grf][1]==f)==(son[f][1]==k))
			zuan(f);
			else
			zuan(k);
		}
		zuan(k);
	}
	root=k;
}
void spl(int k)
{
	while(fa[fa[k]])
	{
		int f=fa[k],grf=fa[f];
		if(fa[grf])
		{
			if((son[grf][1]==f)==(son[f][1]==k))
			zuan(f);
			else
			zuan(k);
		}
		zuan(k);
	}
}
void fi(int k)
{
	sum[0]=0;
	w[0]=0;
	while(fa[k])
	{
		cmp(k);
		k=fa[k];
	}
	cmp(k);
}
int splr(int a,int b)
{
	splay(a);
	spl(b);
	return son[a][1]==b;
}
void del(int k)
{
	if(!k)
	return;
	sta[++top]=k;
	del(son[k][0]);
	del(son[k][1]);
	son[k][0]=0;
	son[k][1]=0;
	lazy[k]=0;
	sam[k]=0;
	sum[k]=0;
	w[k]=0;
	fa[k]=0;
}
void init()
{
	int i;
	scanf("%d %d",&n,&m);
	root=510001;
	 for(i=1;i<=n;i++)
	 {
		 scanf("%d",&v[i]);
		 fa[i]=i-1;
		 son[i][1]=i+1;
		 w[i]=n-i+2;
	}
	fa[1]=510001;
	son[510001][1]=1;
	w[510001]=n+2;
	v[510001]=v[510002]=-10000;
	fa[510002]=n;
	son[n][1]=510002;
	w[510002]=1;
	top=509000-n;
	fi(510002);
	for(i=1;i<=top;i++)
	{
		sta[i]=n+top-i+1;
	}
}
int find(int k)
{
	int t=root;
	for(;;)
	{
		down(t);
		if(k>=w[son[t][0]]+1&&k<=w[son[t][0]]+1)
		{
			fi(t);	
			return t;
		}
		else if(k<=w[son[t][0]])
		t=son[t][0];
		else if(k>w[son[t][0]]+1)
		{
			k=k-1-w[son[t][0]];
			t=son[t][1];
		}			
	}
}
int main()
{
	int i,t,t1,i1;
	init();
	for(i1=1;i1<=m;i1++)
	{
		scanf("%s",ss);
		if(ss[0]=='I')
		{
			scanf("%d %d",&l,&tot);
			t=find(l+1);
			splr(find(l+2),t);
			for(i=1;i<=tot;i++)
			 {
				 scanf("%d",&in[i]);
				 dd[i]=sta[top--];
			 }
			 dd[0]=t;
			 ins(1,tot,0,1);
			 fi(t);
		}
		if(ss[0]=='D')
		{
			 scanf("%d %d",&l,&tot);
			 r=l+tot-1;
			 splr(find(l),find(r+2));
			 del(son[son[root][1]][0]);
			 son[son[root][1]][0]=0;
			 fi(son[root][1]);
		}
		if(ss[0]=='M'&&ss[2]=='K')
		 {
			 scanf("%d %d %d",&l,&tot,&a1);
			 if(!a1)
			 a1=10086;
			 r=l+tot-1;
			 splr(find(l),find(r+2));
			 sam[son[son[root][1]][0]]=a1;
			 down(son[son[root][1]][0]);
			 fi(son[son[root][1]][0]);
		}
		if(ss[0]=='R')
		 {
			 scanf("%d %d %d",&l,&tot,&a1);
			 r=l+tot-1;
			 splr(find(l),find(r+2));
			 lazy[son[son[root][1]][0]]++;
			 down(son[son[root][1]][0]);
			 fi(son[son[root][1]][0]);
		}
		if(ss[0]=='G')
		 {
			 scanf("%d %d",&l,&tot);
			 r=l+tot-1;
			 splr(find(l),find(r+2));
			 printf("%d\n",sum[son[son[root][1]][0]]);
		}
		if(ss[0]=='M'&&ss[2]=='X')
		 {
			 printf("%d\n",ma[root]);
		 }
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值