记录编号 146967 评测结果 AAAAAAAAAA
题目名称 数列操作C 最终得分 100
用户昵称 Gravatarok 是否通过 通过
代码语言 C++ 运行时间 0.712 s
提交时间 2015-01-21 21:49:44 内存使用 7.18 MiB
显示代码纯文本
#include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
using namespace std;
class tree
{
public:
	int l,r,L,R;
	long long s,lazy;
} a[200002];
long long d[100001],n,m,tot=1;
long long maketree(int ll,int rr)
{
	int mid=(ll+rr)/2,root=tot;
	a[root].l=ll;
	a[root].r=rr;
	a[root].lazy=0;
	if(ll<rr)
	{
		a[root].L=++tot;
		maketree(ll,mid);
		a[root].R=++tot;
		maketree(mid+1,rr);
		a[root].s=a[a[root].L].s+a[a[root].R].s;
	}
	else
	{
		a[root].L=0;
		a[root].R=0;
		a[root].s=d[ll];
	}
	return 0;
}
long long add(int root,int ll,int rr,long long z,long long zzz)
{
	if(root==-1) return 0;
	if(ll>a[root].r||rr<a[root].l)
	{
		a[root].s+=zzz*(a[root].r-a[root].l+1);
		a[root].lazy+=zzz;
		return 0;
	}
	if(ll<=a[root].l&&rr>=a[root].r)
	{
		a[root].lazy+=z+zzz;
		a[root].s+=(z+zzz)*(a[root].r-a[root].l+1);
		return 0;
	}
	else
	{
		add(a[root].L,ll,rr,z,zzz+a[root].lazy);
		add(a[root].R,ll,rr,z,zzz+a[root].lazy);
		a[root].lazy=0;
		if(a[root].L!=-1)
		{
			a[root].s=a[a[root].L].s+a[a[root].R].s;
		}
	}
	return 0;
}
long long sum(int root,int ll,int rr,long long zzz)
{
	if(root==-1) return 0;
	if(ll>a[root].r||rr<a[root].l) return 0;
	if(ll<=a[root].l&&rr>=a[root].r)
	{
		return a[root].s+zzz*(a[root].r-a[root].l+1);
	}
	return sum(a[root].L,ll,rr,zzz+a[root].lazy)+sum(a[root].R,ll,rr,zzz+a[root].lazy);
}
int main()
{
	long long i,aaa,bbb,ccc;
	string mmm;
	freopen ("shuliec.in","r",stdin);
	freopen ("shuliec.out","w",stdout);
	cin>>n;
	for(i=1;i<=n;i++) cin>>d[i];
	maketree(1,n);
	cin>>m;
	for(i=1;i<=m;i++)
	{
		cin>>mmm;
		if(mmm[0]=='A')
		{
			cin>>aaa>>bbb>>ccc;
			add(1,aaa,bbb,ccc,0);
		}
		else
		{
			cin>>aaa>>bbb;
			cout<<sum(1,aaa,bbb,0)<<endl;
		}
	}
	return 0;
}