记录编号 558327 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 数列操作C 最终得分 100
用户昵称 Gravatar乐未殇 是否通过 通过
代码语言 C++ 运行时间 7.481 s
提交时间 2020-12-22 10:17:50 内存使用 12.82 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<algorithm>
#include<string>
#define ll long long
#define maxx 100010
using namespace std;
struct tree{
	int z,r;
	ll sum,lz;
}tr[maxx*4];
int a[maxx],n,m;
void build(int rt,int z,int r){
	tr[rt].z=z;
	tr[rt].r=r;
	if(z==r){
		tr[rt].sum=a[z];
		return ;
	}
	int mid=(z+r)/2;
	build(rt*2,z,mid);
	build(rt*2+1,mid+1,r);
	tr[rt].sum=tr[rt*2].sum+tr[rt*2+1].sum;
}
void xc(int rt){
	if(tr[rt].lz){
		tr[rt*2].sum+=tr[rt].lz*(tr[rt*2].r-tr[rt*2].z+1);
		tr[rt*2+1].sum+=tr[rt].lz*(tr[rt*2+1].r-tr[rt*2+1].z+1);
		tr[rt*2].lz+=tr[rt].lz;
		tr[rt*2+1].lz+=tr[rt].lz;
		tr[rt].lz=0;
	}
	return ;
}
void change(int p,int l,int r,int d){
	if(l<=tr[p].z&&r>=tr[p].r){
		tr[p].sum+=(long long)d*(tr[p].r-tr[p].z+1);
		tr[p].lz+=d;
		return ;
	}
	xc(p);
	int mid=(tr[p].z+tr[p].r)/2;
	if(l<=mid)change(p*2,l,r,d);
	if(r>mid)change(p*2+1,l,r,d);
	tr[p].sum=tr[p*2].sum+tr[p*2+1].sum;
}
ll ask(int rt,int z,int r){
	if(z<=tr[rt].z&&tr[rt].r<=r) return tr[rt].sum;
	xc(rt);
	int mid=(tr[rt].z+tr[rt].r)/2;
	ll val=0;
	if(z<=mid)val+=ask(rt*2,z,r);
	if(r>mid)val+=ask(rt*2+1,z,r);
	return val;
}
int main(){
	freopen("shuliec.in","r",stdin);
	freopen("shuliec.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	cin>>m;
	for(int i=1;i<=m;i++){
		char op[3];
		int l,r,d;
		cin>>op>>l>>r;
		if(op[0]=='A'){
			cin>>d;
			change(1,l,r,d);
		}
		else{
			cout<<ask(1,l,r);
		}
	}
	return 0;
}