对于lowbit的证明,注意正数的原码反码和补码是相同的。
add函数给该节点增加值后,while循环一直找父节点加值。
template<class T>
class BIT//Binary Indexed Tree
{
public:
ll n;//a的大小
vector<T>a;//原数组
vector<T>c;//树状数组
ll lowbit(ll a)
{
return a & -a;
}
T getsum(ll i)
{
T sum = 0;
while (i > 0)
{
sum += c[i];
i -= lowbit(i);
}
return sum;
}
void add(ll i, T v)
{
while (i <= n)
{
c[i] += v;
i = i + lowbit(i);
}
}
BIT(vector<T>_a)
{
a = _a;
n = a.size() - 1;
c = vector<T>(n + 1);
//直接把树建好
for (ll i = 1; i <= n; i++)
{
add(i, a[i]);
}
}
};