记录编号 444463 评测结果 AAAAAAAAAA
题目名称 数列操作C 最终得分 100
用户昵称 GravatarTARDIS 是否通过 通过
代码语言 C++ 运行时间 0.246 s
提交时间 2017-09-03 08:57:12 内存使用 9.85 MiB
显示代码纯文本
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1e5+10;
struct node{
    long long sum,add;
    int l,r;
}seg[4*maxn];
int n,m,k,ans,val[maxn];

void build(int l,int r,int o){
    seg[o].l=l,seg[o].r=r;
    if (l==r){
        seg[o].sum=val[l];
        return;
    }
    int mid=(l+r)>>1;
    build(l,mid,o<<1);
    build(mid+1,r,o<<1|1);
    seg[o].sum=seg[o<<1].sum+seg[o<<1|1].sum;
}

void add(int L,int R,int o,int x){
    int l=seg[o].l,r=seg[o].r;
    if (l>=L&&R>=r){
        seg[o].sum+=(long long)(r-l+1)*x;
        seg[o].add+=x;
        return;
    }
    int len=(r-l+1);
    if (seg[o].add){
        seg[o<<1].add+=seg[o].add;
        seg[o<<1|1].add+=seg[o].add;
        seg[o<<1].sum+=(long long)seg[o].add*(len-(len>>1));
        seg[o<<1|1].sum+=(long long)seg[o].add*(len>>1);
        seg[o].add=0;
    }
    int mid=(l+r)>>1;
    if (L<=mid) add(L,R,o<<1,x);
    if (R>mid) add(L,R,o<<1|1,x);
    seg[o].sum=seg[o<<1].sum+seg[o<<1|1].sum;
    return;
}

long long query(int L,int R,int o){
    int l=seg[o].l,r=seg[o].r;
    if (L<=l&&r<=R){
        return seg[o].sum;
    }
    int len=r-l+1;
    if (seg[o].add){
        seg[o<<1].add+=seg[o].add;
        seg[o<<1|1].add+=seg[o].add;
        seg[o<<1].sum+=(long long)seg[o].add*(len-(len>>1));
        seg[o<<1|1].sum+=(long long)seg[o].add*(len>>1);
        seg[o].add=0;
    }
    int mid=(l+r)>>1;
    long long ans=0;
    if (L<=mid) ans+=query(L,R,o<<1);
    if (R>mid) ans+=query(L,R,o<<1|1);
    return ans;
}

int main(){
    freopen("shuliec.in","r",stdin);
    freopen("shuliec.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&val[i]);
    }
    build(1,n,1);
    scanf("%d",&m);
    while (m--){
        char type[8];
        scanf("%s",type);
        if (type[0]=='A'){
            int L,R,k;
            scanf("%d%d%d",&L,&R,&k);
            add(L,R,1,k);
        }
        if (type[0]=='S'){
            int L,R;
            scanf("%d%d",&L,&R);
            printf("%lld\n",query(L,R,1));
        }
    }
}