记录编号 461114 评测结果 AAAAAAAAAA
题目名称 数列操作C 最终得分 100
用户昵称 Gravatar0 是否通过 通过
代码语言 C++ 运行时间 0.250 s
提交时间 2017-10-18 22:20:48 内存使用 6.42 MiB
显示代码纯文本
#include<bits/stdc++.h>

#define LL long long
#define maxn 100010

using namespace std;

int n,m;
LL tr[maxn*4],mark[maxn*4];
char s[100]; 

void update(int x)
{
	tr[x]=tr[x<<1]+tr[x<<1|1];
}

void pushdown(int x,int l,int mid,int r)
{
	if(mark[x]!=0){
		mark[x<<1]+=mark[x];
		mark[x<<1|1]+=mark[x];
		tr[x<<1]+=(mid-l+1)*mark[x];
		tr[x<<1|1]+=(r-mid)*mark[x];
		mark[x]=0;
	}
}

void build(int l,int r,int x)
{
	if(l==r){ scanf("%lld",&tr[x]);return; }
	int mid=(l+r)>>1;
	build(l,mid,x<<1);
	build(mid+1,r,x<<1|1);
	update(x);
}

LL ask(int al,int ar,int l,int r,int x)
{
	if(al<=l&&r<=ar) return tr[x];
	int mid=(l+r)>>1;LL ans=0;
	pushdown(x,l,mid,r);
	if(al<=mid) ans=ask(al,ar,l,mid,x<<1);
	if(ar>mid)  ans+=ask(al,ar,mid+1,r,x<<1|1);
	update(x);
	return ans;
}

void modify(int al,int ar,int w,int l,int r,int x)
{
	if(al<=l&&r<=ar){
		mark[x]+=w;
		tr[x]+=(r-l+1)*w;
		return;
	}
	int mid=(l+r)>>1;
	pushdown(x,l,mid,r);
	if(al<=mid) modify(al,ar,w,l,mid,x<<1);
	if(ar>mid)  modify(al,ar,w,mid+1,r,x<<1|1);
	update(x);
}

int main()
{
	freopen("shuliec.in","r",stdin);
	freopen("shuliec.out","w",stdout);
	scanf("%d",&n);
	build(1,n,1);
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		scanf("%s",s);
		int c,l,r,w;
		scanf("%d%d",&l,&r);
		if(s[0]=='S') printf("%lld\n",ask(l,r,1,n,1));
		else{
			scanf("%d",&w);
			modify(l,r,w,1,n,1);
		}
	}
	return 0;
}