classNumArray { public: voidbuild(){ int cur; for(int i=1; i<v.size(); ++i){ cur = i; while(cur < v.size()){ BIT[cur] += v[i]; cur += lowbit(cur); } } }
intsum(int x){ int total = 0; while(x > 0){ total += BIT[x]; x -= lowbit(x); } return total; }
NumArray(vector<int>& nums) { v.assign(nums.size()+1, 0); BIT.assign(nums.size()+1, 0); for(int i=1; i<=nums.size(); ++i) v[i] = nums[i-1]; build(); } voidupdate(int index, int val){ ++index; int diff = val - v[index]; v[index] = val; while(index < v.size()){ BIT[index] += diff; index += lowbit(index); } } intsumRange(int left, int right){ returnsum(right+1) - sum(left); } };
/** * Your NumArray object will be instantiated and called as such: * NumArray* obj = new NumArray(nums); * obj->update(index,val); * int param_2 = obj->sumRange(left,right); */