记录编号 406138 评测结果 AAAAAAAAAA
题目名称 数列操作C 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 0.183 s
提交时间 2017-05-17 21:47:48 内存使用 6.39 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100010;
void build(int,int,int);
void modify(int,int,int);
void query(int,int,int);
long long sm[maxn<<2],lazy[maxn<<2],ans;
char c[15];
int n,m,s,t,d;
int main(){
	freopen("shuliec.in","r",stdin);
	freopen("shuliec.out","w",stdout);
	scanf("%d",&n);
	build(1,n,1);
	scanf("%d",&m);
	while(m--){
		scanf("%s%d%d",c,&s,&t);
		if(c[0]=='A'){
			scanf("%d",&d);
			modify(1,n,1);
		}
		else{
			ans=0;
			query(1,n,1);
			printf("%lld\n",ans);
		}
	}
	return 0;
}
void build(int l,int r,int rt){
	if(l==r){
		scanf("%lld",&sm[rt]);
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,rt<<1);
	build(mid+1,r,rt<<1|1);
	sm[rt]=sm[rt<<1]+sm[rt<<1|1];
}
void modify(int l,int r,int rt){
	if(s<=l&&t>=r){
		sm[rt]+=(long long)d*(r-l+1);
		lazy[rt]+=d;
		return;
	}
	int mid=(l+r)>>1;
	if(s<=mid)modify(l,mid,rt<<1);
	if(t>mid)modify(mid+1,r,rt<<1|1);
	sm[rt]=sm[rt<<1]+sm[rt<<1|1]+lazy[rt]*(r-l+1);
}
void query(int l,int r,int rt){
	if(s<=l&&t>=r){
		ans+=sm[rt];
		return;
	}
	int mid=(l+r)>>1;
	ans+=lazy[rt]*(min(t,r)-max(s,l)+1);
	if(s<=mid)query(l,mid,rt<<1);
	if(t>mid)query(mid+1,r,rt<<1|1);
}