记录编号 108896 评测结果 WWWWWWWWWW
题目名称 数列操作C 最终得分 0
用户昵称 Gravatardigital-T 是否通过 未通过
代码语言 C++ 运行时间 0.258 s
提交时间 2014-07-06 20:40:14 内存使用 11.00 MiB
显示代码纯文本
#include<algorithm>
#include<cstdio>
#include<string>
#include<iostream>
#include<cmath>
#include<cstring>
#include<fstream>
using namespace std;
//ifstream fi("shuliec.in");
//ofstream fo("shuliec.out");
long long n,m;
long long tot=0;
struct node
{
	long long lc;
	long long rc;
	long long le;
	long long ri;
	long long  sum;
	long long ad;
}v[200002];
long long data[100002];
long long ss[100002];
long long delta,_sum=0;
void build(long long a,long long b)
{
	tot++;
	long long newv;
	newv=tot;
	v[newv].le=a;
	v[newv].ri=b;
	v[newv].ad=0;
	if(a+1<=b)
	{
		long long mid;
		mid=(a+b)>>1;
		v[newv].lc=tot+1;
		build(a,mid);
		v[newv].rc=tot+1;
		build(mid+1,b);
		//v[newv].sum=v[v[newv].lc].sum+v[v[newv].rc].sum;
	}
	if(a==b)
	{
		v[newv].lc=-1;
		v[newv].rc=-1;
	//	v[newv].sum=data[a]+v[newv].ad;
	}
	return;
}
void maintain(long long r)
{
	v[r].sum=0;
	if(v[r].lc!=-1&&v[r].rc!=-1)
	{
		v[r].sum=v[v[r].lc].sum+v[v[r].rc].sum;
	}
	v[r].sum+=v[r].ad*((long long)(v[r].ri-v[r].le+1));
}
		
void add(long long a,long long b,long long r)
{
	if(a>v[r].ri||b<v[r].le||r==-1)
	{
		//v[r].sum+=v[r].ad*(v[r].ri-v[r].le+1);
		return ;
	}
	if(a<=v[r].le&&b>=v[r].ri)
		{
			v[r].ad+=delta;
	}
	else
	{
		add(a,b,v[r].lc);
		add(a,b,v[r].rc);
	}
	/*if(v[r].lc!=-1&&v[r].rc!=-1)
	{
		v[r].sum=v[v[r].lc].sum+v[v[r].rc].sum;
	}
	v[r].sum+=v[r].ad*(v[r].ri-v[r].le+1);*/
	maintain(r);
}
void Sum(long long a,long long b,long long r,long long  Ad)
{
	if(a>v[r].ri||b<v[r].le||r==-1)
		return ;	
	if(a<=v[r].le&&b>=v[r].ri)
	{
		_sum=_sum+v[r].sum+((long long)(v[r].ri-v[r].le+1))*Ad;
	}
	else
	{
		Sum(a,b,v[r].lc,Ad+v[r].ad);
		Sum(a,b,v[r].rc,Ad+v[r].ad);
	}
}	
int main()
{
	//ios::sync_with_stdio(false);
	freopen("shuliec.in","r",stdin);
	freopen("shuliec.out","w",stdout);
	ss[0]=0;
	scanf("%lld\n",&n);
	//fi>>n;
	for(long long i=1;i<=n;i++)
	{
		scanf("%lld",&data[i]);
		//fi>>data[i];
		ss[i]=ss[i-1]+data[i];
	}
	build(1,n);
	scanf("%lld\n",&m);
	//fi>>m;
	string str;
	for(long long i=1;i<=m;i++)
	{
		cin>>str;
		//fi>>str;
		if(str=="ADD")
		{
			long long a,b;
			scanf(" %lld%lld%lld\n",&a,&b,&delta);
			//fi>>a>>b>>delta;
			add(a,b,1);
		}
		if(str=="SUM")
		{
			_sum=0;
			long long a,b;
			scanf(" %lld%lld\n",&a,&b);
			//fi>>a>>b;
			Sum(a,b,1,0);
			_sum=_sum+ss[b]-ss[a-1];
		    printf("%lld\n",_sum);
			//fo<<_sum<<endl;
		}
	}
	return 0;
}