树状数组
树状数组可以在 O(logn)时间内完成:
给 a[i] 加上一个数
求 a[1]+...+a[i] 的和
int lowbit(i) { return x & -x; }
lowbit(7): 111 & 001 => 001
lowbit(8): 1000 & 1000 => 1000
lowbit(6): 110 & 010 => 010
lowbit 就是求从有边开始,第一个为 1 的位置
void add (int x, int value) { for (int i = x; i <= maxn; i = lowbit(i) + i) { tree[i] = tree[i] + value; } }
int get(int x) { int sum = 0; for (int i = x; i > 0; i = i - lowbit(i)) { sum = sum + tree[i]; } return sum; }