记录编号 501081 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 数列操作C 最终得分 100
用户昵称 Gravatar_Itachi 是否通过 通过
代码语言 C++ 运行时间 1.430 s
提交时间 2018-07-19 10:24:23 内存使用 4.87 MiB
显示代码纯文本
//
//  shuliec.cpp
//  
//
//  Created by apple on 2018/7/19.
//

#include <stdio.h>
using namespace std;
#define LL long long
const int maxn=100005<<1;
int cnt=0,n,m,ls[maxn],rs[maxn],s,t;LL lz[maxn],v[maxn],qx;
void Up(int rt){
    v[rt]=v[ls[rt]]+v[rs[rt]];
}
int Set(int l,int r){
    int rt=++cnt;
    if(l==r){
        scanf("%lld",&v[rt]);
        return rt;
    }
    int mid=(l+r)>>1;
    ls[rt]=Set(l,mid),rs[rt]=Set(mid+1,r);
    Up(rt);return rt;
}
void Down(int rt,int l,int r,int mid){
    if(!lz[rt])return;
    lz[ls[rt]]+=lz[rt],lz[rs[rt]]+=lz[rt];
    v[ls[rt]]+=(mid-l+1)*lz[rt],v[rs[rt]]+=(r-mid)*lz[rt];
    lz[rt]=0;
}
void Add(int rt,int l,int r){
    if(s<=l&&r<=t){
        v[rt]+=(r-l+1)*qx,lz[rt]+=qx;
        return;
    }
    int mid=(l+r)>>1;Down(rt,l,r,mid);
    if(s<=mid)Add(ls[rt],l,mid);
    if(t> mid)Add(rs[rt],mid+1,r);
    Up(rt);
}
LL Sum(int rt,int l,int r){
    if(s<=l&&r<=t)return v[rt];
    int mid=(l+r)>>1;Down(rt,l,r,mid);
    LL res=0;
    if(s<=mid)res+=Sum(ls[rt],l,mid);
    if(t> mid)res+=Sum(rs[rt],mid+1,r);
    return res;
}
int main(){
    freopen("shuliec.in","r",stdin);freopen("shuliec.out","w",stdout);
    scanf("%d",&n),Set(1,n);
    scanf("%d",&m);char S[5];
    while(m--){
        scanf("%s",S);
        if(S[0]=='A')scanf("%d%d%lld",&s,&t,&qx),Add(1,1,n);
        else scanf("%d%d",&s,&t),printf("%lld\n",Sum(1,1,n));
    }
}