Fenwick tree
Time O(log n) per call, O(n log n) build Space O(n)Build by adding each value; update adds (val − old); sumRange = prefix(right) − prefix(left − 1).
nums = [1, 3, 5]; sumRange(0, 2); update(1, 2); sumRange(0, 2)bit(map)
Step 1/4Building adds each number into the blocks that cover it. bit[2] covers two numbers, the others cover one.
class NumArray {
private final int[] nums, bit;
public NumArray(int[] nums) {
this.nums = new int[nums.length];
this.bit = new int[nums.length + 1];
for (int i = 0; i < nums.length; i++) update(i, nums[i]);
}
public void update(int index, int val) {
int delta = val - nums[index];
nums[index] = val;
for (int i = index + 1; i < bit.length; i += i & -i) bit[i] += delta;
}
public int sumRange(int left, int right) {
return prefix(right + 1) - prefix(left);
}
private int prefix(int i) { // sum of the first i elements
int s = 0;
for (; i > 0; i -= i & -i) s += bit[i];
return s;
}
}Verdict: Short and fast.