记录编号 446022 评测结果 AAAAAAAAAAT
题目名称 快速红包变换 最终得分 90
用户昵称 Gravatarswttc 是否通过 未通过
代码语言 C++ 运行时间 1.901 s
提交时间 2017-09-07 14:46:47 内存使用 11.38 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#define mid (l+r>>1)
#define ls (o<<1)
#define rs ((o<<1)+1)

using namespace std;

int n,m,av[100010],sum[400010],ad[400010],ch[400010];

struct treemax
{
	int maxx,cmx;
	bool operator < (const treemax & b) const{
		return maxx<b.maxx;
	}
	bool operator > (const treemax & b) const{
		return maxx>b.maxx;
	}
	bool operator != (const treemax & b) const{
		return maxx!=b.maxx;
	}
}tmx[400010];

struct treemin
{
	int minn,cmn;
	bool operator > (const treemin & b) const{
		return minn>b.minn;
	}
	bool operator < (const treemin & b) const{
		return minn<b.minn;
	}
	bool operator != (const treemin & b) const{
		return minn!=b.minn;
	}
}tmn[400010];

void buildt(int l,int r,int o)
{
	if(l==r){
		sum[o]=av[l];
		tmx[o].maxx=av[l];
		tmn[o].minn=av[l];
		tmx[o].cmx=1;
		tmn[o].cmn=1;
		return;
	}
	buildt(l,mid,ls);
	buildt(mid+1,r,rs);
	if(tmx[ls]!=tmx[rs]) tmx[o]=max(tmx[ls],tmx[rs]);
	else{
		tmx[o]=tmx[ls];
		tmx[o].cmx+=tmx[rs].cmx;
	}
	if(tmn[ls]!=tmn[rs]) tmn[o]=min(tmn[ls],tmn[rs]);
	else{
		tmn[o]=tmn[ls];
		tmn[o].cmn+=tmn[rs].cmn;
	}
	sum[o]=sum[ls]+sum[rs];
	return;
}

void pushdown(int l,int r,int o)
{	
	if(ch[o]+1){
		tmx[ls].maxx=ch[o];
		tmx[rs].maxx=ch[o];
		tmn[ls].minn=ch[o];
		tmn[rs].minn=ch[o];
		sum[ls]=(mid-l+1)*ch[o];
		sum[rs]=(r-mid)*ch[o];
		tmx[ls].cmx=mid-l+1;
		tmx[rs].cmx=r-mid;
		tmn[ls].cmn=mid-l+1;
		tmn[rs].cmn=r-mid;
		ch[ls]=ch[o];
		ch[rs]=ch[o];
		ad[ls]=0;
		ad[rs]=0;
		ch[o]=-1;
	}
	if(ad[o]){
		tmx[ls].maxx+=ad[o];
		tmx[rs].maxx+=ad[o];
		tmn[ls].minn+=ad[o];
		tmn[rs].minn+=ad[o];
		sum[ls]+=(mid-l+1)*ad[o];
		sum[rs]+=(r-mid)*ad[o];
		ad[ls]+=ad[o];
		ad[rs]+=ad[o];
		ad[o]=0;
	}
	return;
}

treemax qmx(int l,int r,int o,int ll,int rr)
{
	treemax temp;
	temp.maxx=-2*(1e9);
	temp.cmx=0;
	if(l>=ll&&r<=rr){
		return tmx[o];
	}
	pushdown(l,r,o);
	if(mid>=ll){
		treemax tempp=qmx(l,mid,ls,ll,rr);
		if(temp<tempp) temp=tempp;
		else if(!(temp!=tempp)) temp.cmx+=tempp.cmx;
	}
	if(mid<rr){
		treemax tempp=qmx(mid+1,r,rs,ll,rr);
		if(temp<tempp) temp=tempp;
		else if(!(temp!=tempp)) temp.cmx+=tempp.cmx;
	}
	return temp;
}

treemin qmn(int l,int r,int o,int ll,int rr)
{
	treemin temp;
	temp.minn=2*(1e9);
	temp.cmn=0;
	if(l>=ll&&r<=rr){
		return tmn[o];
	}
	pushdown(l,r,o);
	if(mid>=ll){
		treemin tempp=qmn(l,mid,ls,ll,rr);
		if(temp>tempp) temp=tempp;
		else if(!(temp!=tempp)) temp.cmn+=tempp.cmn;
	}
	if(mid<rr){
		treemin tempp=qmn(mid+1,r,rs,ll,rr);
		if(temp>tempp) temp=tempp;
		else if(!(temp!=tempp)) temp.cmn+=tempp.cmn;
	}
	return temp;
}

int qsm(int l,int r,int o,int ll,int rr)
{
	int temp=0;
	if(l>=ll&&r<=rr){
		return sum[o];
	}
	pushdown(l,r,o);
	if(mid>=ll) temp+=qsm(l,mid,ls,ll,rr);
	if(mid<rr) temp+=qsm(mid+1,r,rs,ll,rr);
	return temp;
}

void cbmax(int l,int r,int o,int ll,int rr,int x)
{	
	if(l>=ll&&r<=rr){
		if(tmx[o].maxx<=x){
			tmx[o].maxx=x;
			tmn[o].minn=x;
			tmx[o].cmx=r-l+1;
			tmn[o].cmn=r-l+1;
			sum[o]=(r-l+1)*x;
			ch[o]=x;
			ad[o]=0;
			return;
		}
		if(tmn[o].minn>=x) return;
		if(l==r) return;
	}
	pushdown(l,r,o);
	if(mid>=ll) cbmax(l,mid,ls,ll,rr,x);
	if(mid<rr) cbmax(mid+1,r,rs,ll,rr,x);
	if(tmx[ls]!=tmx[rs]) tmx[o]=max(tmx[ls],tmx[rs]);
	else{
		tmx[o]=tmx[ls];
		tmx[o].cmx+=tmx[rs].cmx;
	}
	if(tmn[ls]!=tmn[rs]) tmn[o]=min(tmn[ls],tmn[rs]);
	else{
		tmn[o]=tmn[ls];
		tmn[o].cmn+=tmn[rs].cmn;
	}
	sum[o]=sum[ls]+sum[rs];
	return;
}

void cbmin(int l,int r,int o,int ll,int rr,int x)
{	
	if(l>=ll&&r<=rr){
		if(tmn[o].minn>=x){
			tmx[o].maxx=x;
			tmn[o].minn=x;
			tmx[o].cmx=r-l+1;
			tmn[o].cmn=r-l+1;
			sum[o]=(r-l+1)*x;
			ch[o]=x;
			ad[o]=0;
			return;
		}
		if(tmx[o].maxx<=x) return;
		if(l==r) return;
	}
	pushdown(l,r,o);
	if(mid>=ll) cbmin(l,mid,ls,ll,rr,x);
	if(mid<rr) cbmin(mid+1,r,rs,ll,rr,x);
	if(tmx[ls]!=tmx[rs]) tmx[o]=max(tmx[ls],tmx[rs]);
	else{
		tmx[o]=tmx[ls];
		tmx[o].cmx+=tmx[rs].cmx;
	}
	if(tmn[ls]!=tmn[rs]) tmn[o]=min(tmn[ls],tmn[rs]);
	else{
		tmn[o]=tmn[ls];
		tmn[o].cmn+=tmn[rs].cmn;
	}
	sum[o]=sum[ls]+sum[rs];
	return;
}

void cchange(int l,int r,int o,int ll,int rr,int x)
{	
	if(l>=ll&&r<=rr){
		tmx[o].maxx=x;
		tmn[o].minn=x;
		tmx[o].cmx=r-l+1;
		tmn[o].cmn=r-l+1;
		sum[o]=(r-l+1)*x;
		ch[o]=x;
		ad[o]=0;
		return;
	}
	pushdown(l,r,o);
	if(mid>=ll) cchange(l,mid,ls,ll,rr,x);
	if(mid<rr) cchange(mid+1,r,rs,ll,rr,x);
	if(tmx[ls]!=tmx[rs]) tmx[o]=max(tmx[ls],tmx[rs]);
	else{
		tmx[o]=tmx[ls];
		tmx[o].cmx+=tmx[rs].cmx;
	}
	if(tmn[ls]!=tmn[rs]) tmn[o]=min(tmn[ls],tmn[rs]);
	else{
		tmn[o]=tmn[ls];
		tmn[o].cmn+=tmn[rs].cmn;
	}
	sum[o]=sum[ls]+sum[rs];
	return;
}

void cadd(int l,int r,int o,int ll,int rr,int x)
{	
	if(l>=ll&&r<=rr){
		tmx[o].maxx+=x;
		tmn[o].minn+=x;
		sum[o]+=(r-l+1)*x;
		ad[o]+=x;
		return;
	}
	pushdown(l,r,o);
	if(mid>=ll) cadd(l,mid,ls,ll,rr,x);
	if(mid<rr) cadd(mid+1,r,rs,ll,rr,x);
	if(tmx[ls]!=tmx[rs]) tmx[o]=max(tmx[ls],tmx[rs]);
	else{
		tmx[o]=tmx[ls];
		tmx[o].cmx+=tmx[rs].cmx;
	}
	if(tmn[ls]!=tmn[rs]) tmn[o]=min(tmn[ls],tmn[rs]);
	else{
		tmn[o]=tmn[ls];
		tmn[o].cmn+=tmn[rs].cmn;
	}
	sum[o]=sum[ls]+sum[rs];
	return;
}

int main()
{
	freopen("redbag.in","r",stdin);
	freopen("redbag.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&av[i]);
	memset(ch,-1,sizeof(ch));
	buildt(1,n,1);
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		char c[100];
		scanf("%s",c);
		if(c[0]=='C'){
			int w,y,q;
			scanf("%d%d%d",&w,&y,&q);
			if(c[1]=='b'){
				if(c[3]=='a') cbmax(1,n,1,w,y,q);
				else cbmin(1,n,1,w,y,q);
			}
			else if(c[1]=='a') cadd(1,n,1,w,y,q);
			else cchange(1,n,1,w,y,q);
		}
		else{
			int y,q;
			scanf("%d%d",&y,&q);
			if(c[1]=='s') printf("%d\n",qsm(1,n,1,y,q));
			else{
				if(c[1]=='w'){
					if(c[3]=='a'){
						treemax temp=qmx(1,n,1,y,q);
						printf("%d\n",temp.maxx);
					}
					else{
						treemin temp=qmn(1,n,1,y,q);
						printf("%d\n",temp.minn);
					}
				}
				else{
					if(c[3]=='a'){
						treemax temp=qmx(1,n,1,y,q);
						printf("%d\n",temp.cmx);
					}
					else{
						treemin temp=qmn(1,n,1,y,q);
						printf("%d\n",temp.cmn);
					}
				}
			}
		}
	}
	return 0;
}