307. Range Sum Query - Mutable
Given nums = [1, 3, 5]
sumRange(0, 2) -> 9
update(1, 2)
sumRange(0, 2) -> 8Last updated
Given nums = [1, 3, 5]
sumRange(0, 2) -> 9
update(1, 2)
sumRange(0, 2) -> 8Last updated
// 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;
};