比赛 cdcqの省选膜你赛 评测结果 AAAAAAAAAAAAAAAAEEEE
题目名称 新史「新幻想史 -现代史-」 最终得分 80
用户昵称 scpointer 运行时间 3.656 s
代码语言 C++ 内存使用 184.54 MiB
提交时间 2017-04-11 21:56:37
显示代码纯文本
#include <cstdio>
typedef long long ll;
inline int RD()
{
	int res;char cr;
	while( (cr=getchar())<'0' || cr>'9'); res=cr-'0';
	while( (cr=getchar())>='0' && cr<='9') res=res*10+cr-'0';
	return res;
}
inline char RC()
{
	char cr;
	while( (cr=getchar())<'A' || cr>'Z');
	return cr;
}

#define N 100050
#define NDS 8000050
#define LIM 100000
#define lowbit(x) ((x)&(-x))
int rot[N];

int ls[NDS],rs[NDS],ndcnt;
ll sum[NDS],prev[NDS];
void pushdown(int rt,int l,int r)
{
	if(prev[rt])
	{
		if(!ls[rt]) ls[rt]=++ndcnt;
		if(!rs[rt]) rs[rt]=++ndcnt;
		int mid=(l+r)>>1;
		prev[ls[rt]]+=prev[rt];
		prev[rs[rt]]+=prev[rt];
		sum[ls[rt]]+=prev[rt]*(mid-l+1);
		sum[rs[rt]]+=prev[rt]*(r-mid);
		prev[rt]=0;
	}
}
void update(int rt){sum[rt]=sum[ls[rt]]+sum[rs[rt]];}
void add(int &rt,int gl,int gr,ll gv,int l=1,int r=LIM)
{
	if(!rt) rt=++ndcnt;
	else pushdown(rt,l,r);
	if(gl==l && gr==r)
	{
		prev[rt]+=gv;
		sum[rt]+=gv*(r-l+1);
		return;
	}
	int mid=(l+r)>>1;
	if(gr<=mid) add(ls[rt],gl,gr,gv,l,mid);
	else if(gl>mid) add(rs[rt],gl,gr,gv,mid+1,r);
	else add(ls[rt],gl,mid,gv,l,mid),add(rs[rt],mid+1,gr,gv,mid+1,r);
	update(rt);
}
ll getsum(int &rt,int gl,int gr,int l=1,int r=LIM)
{
	if(!rt) return 0;
	else pushdown(rt,l,r);
	if(gl==l && gr==r)
		return sum[rt];
	int mid=(l+r)>>1;
	if(gr<=mid) return getsum(ls[rt],gl,gr,l,mid);
	else if(gl>mid) return getsum(rs[rt],gl,gr,mid+1,r);
	else return getsum(ls[rt],gl,mid,l,mid)+getsum(rs[rt],mid+1,gr,mid+1,r);
}

ll ai[N];
int main()
{
	freopen("cdcq_a.in","r",stdin);
	freopen("cdcq_a.out","w",stdout);
	int n,Q;n=RD();Q=RD();
	for(int i=1;i<=n;i++)
		ai[i]=ai[i-1]+RD();
	while(Q--)
	{
		if(RC()=='M')
		{
			int l1,r1,v1,l2,r2,v2,tim;
			l1=RD();r1=RD();v1=RD();l2=RD();r2=RD();v2=RD();tim=RD();
			for(;tim<=LIM;tim+=lowbit(tim))
				add(rot[tim],l1,r1,-v1),add(rot[tim],l2,r2,v2);
		}
		else
		{
			int l,r,tim;ll ans=0;
			l=RD();r=RD();tim=RD();
			for(;tim;tim-=lowbit(tim))
				ans+=getsum(rot[tim],l,r);
			printf("%lld\n",ans+ai[r]-ai[l-1]);
		}
	}
}