概念源自所有正整數都可以表示為power of 2的數的總和。
e.g. 19 = 2^4 + 2^1 + 2^0
BIT裡的每個node存的數是n個數的和,n為power of 2。
n & -n 是為了取rightmost bit。
// Binary Index Tree
class NumArray {
public:
NumArray(vector<int> nums) : BIT(nums.size() + 1, 0) {
for (int i = 0; i < nums.size(); ++i) {
int val = nums[i];
int index = i + 1;
while (index < BIT.size()) {
BIT[index] += val;
index += (index & -index);
}
}
}
int getSum(int i) {
int sum = 0;
int index = i + 1;
while (index > 0) {
sum += BIT[index];
index -= (index & -index);
}
return sum;
}
void update(int i, int val) { // time: O(logn)
int orig = getSum(i) - getSum(i - 1);
int diff = val - orig;
int index = i + 1;
while (index < BIT.size()) {
BIT[index] += diff;
index += (index & -index);
}
}
int sumRange(int i, int j) { // time: O(logn)
return getSum(j) - getSum(i - 1);
}
vector<int> BIT;
};