传送门1
传送门2
(0)定义:
#define lson rt<<1
#define rson rt<<1|1
const int maxn=1e5+5;//元素总个数
int sum[maxn<<2];//Sum求和,开四倍空间
int a[maxn];//原数组下标[1,n]
(1)建树:
#include<bits/stdc++.h>
#define lson rt<<1
#define rson rt<<1|1
using namespace std;
void push_up(int rt)//push_up函数更新节点信息,这里是求和
{
sum[rt]=sum[lson]+sum[rson];
}
void build(int l,int r,int rt) //[l,r]表示当前节点区间,rt表示当前节点的实际存储位置
{
if(l==r){//若到达叶节点
sum[rt]=a[l];//存储a数组的值,应该是a[l]
return ;
}
int mid=(l+r)>>1;
//左右递归
build(l,mid,lson);
build(mid+1,r,rson);
//更新信息
push_up(rt);
}
(2)点修改:
假设A[L]+=C
void update(int L,int C,int l,int r,int rt){//[l,r]表示当前区间,rt是当前节点编号//l,r表示当前节点区间,rt表示当前节点编号
if(l==r){//到达叶节点,修改叶节点的值
sum[rt]+=C;
return;
}
int m=(l+r)>>1;
//根据条件判断往左子树调用还是往右
if(L <= m) update(L,C,l,m,lson);
else update(L,C,m+1,r,rson);