记录编号 414814 评测结果 WWWWWWWWWW
题目名称 [Tyvj 1518] CPU监控 最终得分 0
用户昵称 GravatarAnonymity 是否通过 未通过
代码语言 C++ 运行时间 0.299 s
提交时间 2017-06-15 09:01:46 内存使用 12.90 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
#define mem(a,b) memset(a,b,sizeof(a))
#define maxn 400005
#define maxx 100005
using namespace std;
int t,e,pnum[maxx],nmax[maxn],nset[maxn],pmax[maxn],pset[maxn],padd[maxn],nadd[maxn],inf=0x7fffffff;
struct tree{int lc,rc;}tr[maxn];
void pushup(int x)
{
	int lch=x<<1,rch=lch|1;
	nmax[x]=max(nmax[lch],nmax[rch]);
	pmax[x]=max(pmax[lch],pmax[rch]);
}
void build(int x,int y,int z)
{
	tr[z].lc=x;
	tr[z].rc=y;
	nset[z]=-inf;
	pset[z]=-inf;
	if(x==y)
	{
		nmax[z]=pnum[x];
		pmax[z]=pnum[x];
		return;
	}
	int mid=x+y>>1,lch=z<<1,rch=lch|1;
	build(x,mid,lch);
	build(mid+1,y,rch);
	pushup(z);
}
void pushdown(int x)
{
	int lch=x<<1,rch=lch|1;
	pmax[lch]=max(pmax[lch],max(padd[x]+nmax[lch],pset[x]));
	pmax[rch]=max(pmax[rch],max(padd[x]+nmax[rch],pset[x]));
	if(nset[x]==-inf)
	{
		nmax[lch]+=nadd[x];
		nmax[rch]+=nadd[x];
		if(nset[lch]==-inf)
		{	padd[lch]=max(padd[lch],nadd[lch]+padd[x]);
			nadd[lch]+=nadd[x];
		}
		else
		{	pset[lch]=max(pset[lch],nset[lch]+padd[x]);
			//nset[lch]=nmax[lch];//
		}
		if(nset[rch]==-inf)
		{	padd[rch]=max(padd[rch],nadd[rch]+padd[x]);
			nadd[rch]+=nadd[x];
		}
		else
		{	pset[rch]=max(pset[rch],nset[rch]+padd[x]);
			//nset[rch]=nmax[rch];//
		}
	}
	else
	{	
		if(nset[lch]==-inf)
		{	padd[lch]=max(padd[lch],nadd[lch]+padd[x]);
			nadd[lch]+=padd[x];
		}
		else
			pset[lch]=max(pset[lch],nmax[lch]+padd[x]);
		nmax[lch]=nset[lch]=nset[x];
		pset[lch]=max(pset[x],pset[lch]);
		if(nset[rch]==-inf)
		{	padd[rch]=max(padd[rch],nadd[rch]+padd[x]);
			nadd[rch]+=padd[x];
		}
		else
			pset[rch]=max(pset[rch],nmax[rch]+padd[x]);
		nmax[rch]=nset[rch]=nset[x];
		pset[rch]=max(pset[x],pset[rch]);
	}
	nadd[x]=0;
	padd[x]=0;
	nset[x]=-inf;
	pset[x]=-inf;
}
void updata(int x,int y,int z,int v,int o)
{
	if(tr[z].lc>=x&&tr[z].rc<=y)
	{
		if(o)
		{
			nmax[z]=v;
			nset[z]=v;
			pmax[z]=max(pmax[z],nmax[z]);
			pset[z]=max(pset[z],nset[z]);
		}
		else
		{
			nmax[z]+=v;
			pmax[z]=max(pmax[z],nmax[z]);
			if(nset[z]==-inf)
			{	nadd[z]+=v;
				padd[z]=max(padd[z],nadd[z]);
			}
			else
			{	nset[z]=nmax[z];
				pset[z]=max(pset[z],nset[z]);
			}
		}
		return;
	}
	pushdown(z);
	int mid=tr[z].lc+tr[z].rc>>1,lch=z<<1,rch=lch|1;
	if(x<=mid)
		updata(x,y,lch,v,o);
	if(mid<y)
		updata(x,y,rch,v,o);
	pushup(z);
}
int query(int x,int y,int z,int o)
{
	if(tr[z].lc>=x&&tr[z].rc<=y)
		return o?pmax[z]:nmax[z];
	pushdown(z);
	int mid=tr[z].lc+tr[z].rc>>1,lch=z<<1,rch=lch|1,tmp=-inf;;
	if(x<=mid)
		tmp=max(tmp,query(x,y,lch,o));
	if(mid<y)
		tmp=max(tmp,query(x,y,rch,o));
	return tmp;
}
int main()
{
	freopen("cpuwatcher.in","r",stdin);
	freopen("cpuwatcher.out","w",stdout);
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
		scanf("%d",&pnum[i]);
	int x,y,z;
	build(1,t,1);
	scanf("%d",&e);
	char ord[10];
	for(int i=1;i<=e;i++)
	{
		scanf("%s",ord);
		if(ord[0]=='Q')
		{
			scanf("%d%d",&x,&y);
			printf("%d\n",query(x,y,1,0));
		}
		if(ord[0]=='A')
		{
			scanf("%d%d",&x,&y);
			printf("%d\n",query(x,y,1,1));
		}
		if(ord[0]=='P')
		{
			scanf("%d%d%d",&x,&y,&z);
			updata(x,y,1,z,0);
		}
		if(ord[0]=='C')
		{
			scanf("%d%d%d",&x,&y,&z);
			updata(x,y,1,z,1);
		}
	}
	//while(1);
	return 0;
}