voidbuild(int u, int l, int r){ if(l == r) tr[u] = {l,r,w[r]}; else{ tr[u] = {l,r}; int mid = tr[u].l + tr[u].r >> 1; build(u<<1,l,mid), build(u<<1 | 1 , mid+1 ,r); pushup(u); } }
modify 修改某个点的值
1 2 3 4 5 6 7 8 9
voidmodify(int u, int x, int v){ if(tr[u].l == tr[u].r ) tr[u].sum += v; else{ int mid = tr[u].l + tr[u].r >> 1; if(x <= mid) modify(u<<1, x , v); elsemodify(u<<1|1 , x , v); pushup(u); } }
query 查询
1 2 3 4 5 6 7 8 9 10
intquery(int u, int l, int r){ if(tr[u].l>=l && tr[u].r<=r) return tr[u].sum; else{ int mid = tr[u].l + tr[u].r >> 1; int sum = 0; if(l <= mid) sum += query(u<<1 , l ,mid); if(r > mid) sum += query(u<<1|1,l,r); return sum } }