记录编号 414944 评测结果 AAAAAAAAAA
题目名称 [Tyvj 1518] CPU监控 最终得分 100
用户昵称 GravatarHzoi_Mafia 是否通过 通过
代码语言 C++ 运行时间 0.316 s
提交时间 2017-06-15 11:54:10 内存使用 9.85 MiB
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int inf=1<<31;
inline int read(){
	int sum(0),f(1);
	char ch(getchar());
	while(ch<'0'||ch>'9'){
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		sum=sum*10+ch-'0';
		ch=getchar();
	}
	return sum*f;
}
int n,m;
int v[100001];
int padd[400001],pset[400001],pmx[400001];
int nadd[400001],nset[400001],nmx[400001];
inline int my_max(int a,int b){
	return a>b?a:b;
}
inline void pushup(int i){
	int l(i<<1),r(l|1);
	pmx[i]=my_max(pmx[l],pmx[r]);
	nmx[i]=my_max(nmx[l],nmx[r]);
}
inline void pushdown(int rt){
	int ch(rt<<1);
	for(int i=0;i<=1;i++){
		int nowch(ch+i);
		pmx[nowch]=my_max(pmx[nowch],my_max(padd[rt]+nmx[nowch],pset[rt]));
		if(nset[rt]==inf){
			nmx[nowch]+=nadd[rt];
			if(nset[nowch]==inf){
				padd[nowch]=my_max(padd[nowch],nadd[nowch]+padd[rt]);
				nadd[nowch]+=nadd[rt];
			}
			else{
				pset[nowch]=my_max(pset[nowch],nset[nowch]+padd[rt]);
				nset[nowch]=nmx[nowch];
			}
		}
		else{
			if(nset[nowch]==inf){
				padd[nowch]=my_max(padd[nowch],nadd[nowch]+padd[rt]);
				nadd[nowch]+=padd[rt];
			}
			else
				pset[nowch]=my_max(pset[nowch],nmx[nowch]+padd[rt]);
			nmx[nowch]=nset[rt];
			nset[nowch]=nset[rt];
			pset[nowch]=my_max(pset[rt],pset[nowch]);
		}
	}
	nadd[rt]=0;
	padd[rt]=0;
	nset[rt]=inf;
	pset[rt]=inf;
}
inline void build(int l,int r,int i){
	padd[i]=0;
	pset[i]=inf;
	nadd[i]=0;
	nset[i]=inf;
	if(l==r){
		pmx[i]=v[l];
		nmx[i]=v[l];
		return;
	}
	int lc(i<<1),rc(lc|1),mid((l+r)>>1);
	build(l,mid,lc);
	build(mid+1,r,rc);
	pushup(i);
}
inline void update_set(int ll,int rr,int c,int l,int r,int i){
	if(ll<=l&&r<=rr){
		nset[i]=c;
		nmx[i]=c;
		pset[i]=my_max(pset[i],nset[i]);
		pmx[i]=my_max(pmx[i],nmx[i]);
		return;
	}
	pushdown(i);
	int lc(i<<1),rc(lc|1),mid((l+r)>>1);
	if(ll<=mid)
		update_set(ll,rr,c,l,mid,lc);
	if(rr>mid)
		update_set(ll,rr,c,mid+1,r,rc);
	pushup(i);
}
inline void update_add(int ll,int rr,int c,int l,int r,int i){
	if(ll<=l&&r<=rr){
		nmx[i]+=c;
		pmx[i]=my_max(pmx[i],nmx[i]);
		if(nset[i]==inf){
			nadd[i]+=c;
			padd[i]=my_max(padd[i],nadd[i]);
		}
		else{
			nset[i]=nmx[i];
			pset[i]=my_max(pset[i],nset[i]);
		}
		return;
	}
	pushdown(i);
	int lc(i<<1),rc(lc|1),mid((l+r)>>1);
	if(ll<=mid)
		update_add(ll,rr,c,l,mid,lc);
	if(rr>mid)
		update_add(ll,rr,c,mid+1,r,rc);
	pushup(i);
}
inline int query_p(int ll,int rr,int l,int r,int i){
	if(ll<=l&&r<=rr)
		return pmx[i];
	pushdown(i);
	int lc(i<<1),rc(lc|1),mid((l+r)>>1);
	int ret(inf);
	if(ll<=mid)
		ret=my_max(ret,query_p(ll,rr,l,mid,lc));
	if(rr>mid)
		ret=my_max(ret,query_p(ll,rr,mid+1,r,rc));
	return ret;
}
inline int query_n(int ll,int rr,int l,int r,int i){
	if(ll<=l&&r<=rr)
		return nmx[i];
	pushdown(i);
	int lc(i<<1),rc(lc|1),mid((l+r)>>1);
	int ret(inf);
	if(ll<=mid)
		ret=my_max(ret,query_n(ll,rr,l,mid,lc));
	if(rr>mid)
		ret=my_max(ret,query_n(ll,rr,mid+1,r,rc));
	return ret;
}
inline void write(int x){
	if(x==0){
		putchar('0');
		return;
	}if(x<0)
		putchar('-'),x=-x;
	int len=0,buf[15];
	while(x)
		buf[len++]=x%10,x/=10;
	for(int i=len-1;i>=0;i--)
		putchar(buf[i]+'0');
	return;
}
int main(){
	freopen("cpuwatcher.in","r",stdin);
	freopen("cpuwatcher.out","w",stdout);
	n=read();
	for(int i=1;i<=n;i++)
		v[i]=read();
	/*for(int i=1;i<=n;i++)
		cout<<v[i]<<' ';*/
	build(1,n,1);
	m=read();
	char op[2];
	while(m--){
		scanf("%s",op);
		if(op[0]=='Q'){
			int x(read()),y(read());
			write(query_n(x,y,1,n,1));
			continue;
		}
		if(op[0]=='A'){
			int x(read()),y(read());
			write(query_p(x,y,1,n,1));
			continue;
		}
		if(op[0]=='P'){
			int x(read()),y(read()),z(read());
			update_add(x,y,z,1,n,1);
			continue;
		}
		if(op[0]=='C'){
			int x(read()),y(read()),z(read());
			update_set(x,y,z,1,n,1);
			continue;
		}
	}//while(1);
}