思路
线段树裸题,区间修改+区间查询,板子如下。
需要注意的一个坑点就是读命令的时候不要漏掉换行符。
(个人码风习惯把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; }