思路

线段树裸题,区间修改+区间查询,板子如下。
需要注意的一个坑点就是读命令的时候不要漏掉换行符。
(个人码风习惯把int改成ll,各位还是要注意别爆了)

代码

#include<bits/stdc++.h>
#define int ll
using namespace std;
typedef long long ll;
const int maxn=100005;
int n,m,x,y,z,a[maxn],tree[maxn*4];
char ch;

void build(int node,int start,int end){
    if(start==end){
        tree[node]=a[start];
        return;
    }
    int mid=start+end>>1;
    build(node<<1,start,mid);
    build(node<<1|1,mid+1,end);
    tree[node]=tree[node<<1]+tree[node<<1|1];
}

void add(int node,int start,int end,int l,int r,int val){
    if(start==end){
        tree[node]+=val;
        a[start]+=val;
        return;
    }
    int mid=start+end>>1;
    if(l<=mid) add(node<<1,start,mid,l,r,val);
    if(r>mid) add(node<<1|1,mid+1,end,l,r,val);
    tree[node]=tree[node<<1]+tree[node<<1|1];
}

int query(int node,int start,int end,int l,int r){
    if(l<=start&&end<=r) return tree[node];
    int mid=start+end>>1;
    int res=0;
    if(l<=mid) res+=query(node<<1,start,mid,l,r);
    if(r>mid) res+=query(node<<1|1,mid+1,end,l,r);
    return res; 
}

signed main(){
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++)    scanf("%lld",&a[i]);
    build(1,1,n);
    for(int i=1;i<=m;i++){
        getchar();//跳过换行符
        ch=getchar();
        if(ch=='Q'){
            scanf("%lld%lld",&x,&y);
            cout<<query(1,1,n,x,y)<<endl;
        }else if(ch=='C'){
            scanf("%lld%lld%lld",&x,&y,&z);
            add(1,1,n,x,y,z);
        }
    }
    return 0;
}