树状数组模版代码:
int lowbit(int i)
{
return i & -i;//或者是return i-(i&(i-1));表示求数组下标二进制的非0最低位所表示的值
}
void update(int i,int val)//更新单节点的值
{
while(i<=n){
a[i]+=val;
i+=lowbit(i);//由叶子节点向上更新a数组,从左往右更新
}
}
int sum(int i)//求和节点的值
{
int ret=0;
while(i>0){
ret+=a[i];//从右往左区间求和
i-=lowbit(i);
}
return ret;
}