记录编号 394105 评测结果 AAAAAAAAAA
题目名称 数列操作C 最终得分 100
用户昵称 GravatarJustWB 是否通过 通过
代码语言 C++ 运行时间 0.345 s
提交时间 2017-04-12 23:06:16 内存使用 31.59 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,ii,jj,s,t;
char zfc[5];
long long d,lin;
long long N[100001];
struct stree
{
	int l,r,f,sl;
	long long z;
	long long lz;
	stree(){l=0;r=0;f=0;sl=0;z=0;lz=0;}
}tree[1000001];
void build(int l,int r,int now)
{
	int mid=(l+r)/2;
	tree[now].l=l;tree[now].r=r;tree[now].sl=(r-l)+1;
	if(l==r)
	{
		tree[now].z=N[l];return;
	}
	tree[2*now].f=now;tree[2*now+1].f=now;
	build(l,mid,2*now);
	build(mid+1,r,2*now+1);
	tree[now].z=tree[2*now].z+tree[2*now+1].z;
}
void updatex(int now,int v)
{
	tree[2*now].z+=tree[2*now].sl*v;tree[2*now].lz+=v;
	tree[2*now+1].z+=tree[2*now+1].sl*v;tree[2*now+1].lz+=v;
	tree[now].lz=0;
}
void updates(int now)
{
	while(now!=0)
	{
		tree[now].z=tree[2*now].z+tree[2*now+1].z;
		now=tree[now].f;
	}
}
void add(int l,int r,int dl,int dr,int now)
{
	int mid=(l+r)/2;
	if(tree[now].lz!=0)
	{
		updatex(now,tree[now].lz);
		updates(tree[now].f);
	}
	if(l==dl&&r==dr)
	{
		tree[now].lz=d;
		tree[now].z+=tree[now].sl*d;
		updates(tree[now].f);
		return;
	}
	if(dr<=mid)
	{
		add(l,mid,dl,dr,2*now);
		return;
	}
	if(dl>mid)
	{
		add(mid+1,r,dl,dr,2*now+1);
		return;
	}
	if(dl<=mid&&dr>mid)
	{
		add(l,mid,dl,mid,2*now);
		add(mid+1,r,mid+1,dr,2*now+1);
		return;
	}
}
void search(int l,int r,int dl,int dr,int now)
{
	int mid=(l+r)/2;
	if(tree[now].lz!=0)
	{
		updatex(now,tree[now].lz);
		updates(tree[now].f);
	}
	if(l==dl&&r==dr)
	{
		lin+=tree[now].z;return;
	}
	if(dr<=mid)
	{
		search(l,mid,dl,dr,2*now);
		return;
	}
	if(dl>mid)
	{
		search(mid+1,r,dl,dr,2*now+1);
		return;
	}
	if(dl<=mid&&dr>mid)
	{
		search(l,mid,dl,mid,2*now);
		search(mid+1,r,mid+1,dr,2*now+1);
		return;
	}
}
int main()
{
	freopen("shuliec.in","r",stdin);
	freopen("shuliec.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&N[i]);
	}
	build(1,n,1);
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%s",&zfc);
		if(zfc[0]=='A')
		{
			scanf("%d%d%lld",&ii,&jj,&d);
			add(1,n,ii,jj,1);
		}
		else
		{
			scanf("%d%d",&s,&t);lin=0;
			search(1,n,s,t,1);
			printf("%lld\n",lin);
		}
	}
	return 0;
 }