ll a[N+5];
struct node
{
ll sum,l,r;//左子叶,右子叶
} tree[N*4+10];
void update(int k)
{
tree[k].sum=tree[k*2].sum+tree[k*2+1].sum;
}
void build_tree(ll k, ll l, ll r)//建树
{
tree[k].l=l,tree[k].r=r;
if(l==r)
{
tree[k].sum=a[l];
return ;
}
ll mid=(l+r)/2;
build_tree(k*2,l,mid);
build_tree(k*2+1,mid+1,r);
update(k);
}
void A_d(ll k,ll x,ll y)//单点修改
{
if(tree[k].l==tree[k].r)
{
tree[k].sum+=y;
return ;
}
ll mid=(tree[k].l+tree[k].r)/2;
if(mid>=x)
A_d(k*2,x,y);
else
A_d(k*2+1,x,y);
update(k);
}
ll query(ll k,ll l,ll r)
{
if(tree[k].l>=l&&tree[k].r<=r)
{
return tree[k].sum;
}
ll mid=(tree[k].l+tree[k].r)/2;
if(mid>=r)
return query(k*2,l,r);
if(mid<l)
return query(k*2+1,l,r);
return query(k*2+1,mid+1,r)+query(k*2,l,mid);
}
线段树(区间求和,单点修改)
最新推荐文章于 2023-01-14 10:06:45 发布