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