首先是lowbit
值的是对于一个数的二进制形式,从低位往高位,第一个为1的位数的权值
如:
6的二进制为110第二位为第一个为1的位数
其权值就是2
8的二进制为1000第四位为第一个为1的位数
其权值就是8
ll lowbit(ll x)
{
return x&-x;
}
这时,我们定义一个数组c,代表a[n]中从i-lowbit到i的和
如果要改变a[i]的值,那么,其实只需要将c[]中包含a[i]的全部加一遍即可
然而,对于c[i],c[i]若包含a[i]的话,那么c[i]-lowbit也包含a[i]
模板如下:
void add(ll x,ll k)
{
for(ll i=x;i<=n;i+=lowbit(i))c[i]+=k;
}
下面这一段则是求和
利用的是前缀和的原理
ll ask(ll x)
{
ll sum=0;
for(ll i=x;i;i-=lowbit(i))sum+=c[i];
return sum;
}