建树
void build(int node,int l,int r)
{
if(l==r){
cin>>tree[node];
return ;
}
int mid=l+r>>1;
build(node<<1,l,mid);
build(node<<1|1,mid+1,r);
pushup(node);
}
更新左右结点
int pushup(int node)
{
return tree[node]=tree[node<<1]+tree[node<<1|1];
}
单点查询
int query(int root ,int l ,int r,int k){
if (l == r) return tree[node];
int mid = l + r >> 1;
if (k <= mid) return query(root << 1,l,mid,k);
else return query(root << 1 | 1,mid + 1,r,k);
}
区间查询
int query(int node,int l,int r,int L,int R)
{
if(L<=l&&R>=r)
{
return tree[node];
}
int mid=l+r>>1;
pushdown(node,mid-l+1,r-mid);
int ans=0;
if(L<=mid)
ans+=query(node<<1,l,mid,L,R);
if(mid<R)
ans+=query(node<<1|1,mid+1,r,L,R);
return ans;
}
懒人标记下推
void pushdown(int node,int x,int y)
{
if(lazzy[node])
{
tree[node<<1]+=x*lazzy[node];
tree[node<<1|1]+=y*lazzy[node];
lazzy[node<<1]+=lazzy[node];
lazzy[node<<1|1]+=lazzy[node];
lazzy[node]=0;
}
}
单点修改
void update(int root,int l,int r,int k,int val){
if (l == r){
tree[root] += val;
return;
}
int mid = l + r >> 1;
if (k <= mid){
update(root<<1,l,mid,k,val);
}
else{
update(root << 1 | 1 ,mid + 1,r,k,val);
}
pushup(root);
}
区间修改
void update(int node,int l,int r,int L,int R,int val)
{
if(L<=l&&R>=r)
{
lazzy[node]+=val;
tree[node]+=(r-l+1)*val;
return ;
}
int mid=l+r>>1;
pushdown(node,mid-l+1,r-mid);
if(L<=mid)
update(node<<1,l,mid,L,R,val);
if(mid<R)
update(node<<1|1,mid+1,r,L,R,val);
pushup(node);
}