这份模板大概可以做到单点更新值和区间求和
const int maxn = 50005;
struct node{
int l,r,sum;
}tree[maxn*9];
int a[maxn];
void build(int l,int r,int index){
tree[index].l = l;
tree[index].r = r;
if(l == r){
tree[index].sum = a[l];
return;
}
int middle = (l+r)/2;
build(l,middle,2*index);
build(middle+1,r,2*index+1);
tree[index].sum = tree[2*index].sum + tree[2*index+1].sum;
}
void update(int number,int index,int ans){
tree[index].sum += ans;
if(tree[index].l == tree[index].r&&tree[index].l == number)
return ;
int middle = (tree[index].l+tree[index].r)/2;
if(middle >= number) update(number,2*index,ans);
else update(number,2*index+1,ans);
}
int getsum(int l,int r,int index){
if(tree[index].l == l&&tree[index].r == r)
return tree[index].sum;
int middle = (tree[index].l+tree[index].r)/2;
if(middle < l) return getsum(l,r,2*index+1);
else if(middle >= r) return getsum(l,r,2*index);
else return getsum(l,middle,2*index)+getsum(middle+1,r,2*index+1);
}