|
| 1 | +int diff; |
| 2 | +vector<int> vect; |
| 3 | +int buildtree(int i,int st,int en,vector<int> nums){ |
| 4 | + if(st==en) return vect[i] = nums[st]; |
| 5 | + else if(st>en) return 0; |
| 6 | + else{ |
| 7 | + int mid = (st+en)/2; |
| 8 | + vect[i] = buildtree(2*i+1,st,mid,nums) + buildtree(2*i+2,mid+1,en,nums); |
| 9 | + return vect[i]; |
| 10 | + } |
| 11 | + } |
| 12 | +int get_sum(int i,int st,int en,int left,int right){ |
| 13 | + if(st>en) return 0; |
| 14 | + else if(st>right || en<left) return 0; |
| 15 | + else{ |
| 16 | + if(st>=left && en<=right) return vect[i]; |
| 17 | + else{ |
| 18 | + int mid = (st+en)/2; |
| 19 | + return get_sum(2*i+1,st,mid,left,right) + get_sum(2*i+2,mid+1,en,left,right); |
| 20 | + } |
| 21 | + } |
| 22 | +} |
| 23 | +void get_updated(int i,int st,int en,int index,int val){ |
| 24 | + if(st>en) return; |
| 25 | + else if(st==en && st==index){ |
| 26 | + diff = val-vect[i]; |
| 27 | + vect[i] = val; |
| 28 | + return; |
| 29 | + } |
| 30 | + else{ |
| 31 | + if(st>index || en<index) return; |
| 32 | + else{ |
| 33 | + int mid = (st+en)/2; |
| 34 | + get_updated(2*i+1,st,mid,index,val); |
| 35 | + get_updated(2*i+2,mid+1,en,index,val); |
| 36 | + vect[i] = vect[i]+diff; |
| 37 | + } |
| 38 | + } |
| 39 | +} |
| 40 | +class NumArray { |
| 41 | +public: |
| 42 | + int cap; |
| 43 | + NumArray(vector<int>& nums) { |
| 44 | + int m = nums.size(); |
| 45 | + vect.clear(); |
| 46 | + for(int i=0;i<=4*m;i++) vect.push_back(0); |
| 47 | + int st=0,en=m-1; |
| 48 | + this->cap=en;diff=0; |
| 49 | + buildtree(0,st,en,nums); |
| 50 | + } |
| 51 | + void update(int index, int val) { |
| 52 | + int st=0,en=this->cap; |
| 53 | + get_updated(0,st,en,index,val); |
| 54 | + } |
| 55 | + |
| 56 | + int sumRange(int left, int right) { |
| 57 | + int st=0,en=this->cap; |
| 58 | + return get_sum(0,st,en,left,right); |
| 59 | + } |
| 60 | +}; |
| 61 | + |
| 62 | +/** |
| 63 | + * Your NumArray object will be instantiated and called as such: |
| 64 | + * NumArray* obj = new NumArray(nums); |
| 65 | + * obj->update(index,val); |
| 66 | + * int param_2 = obj->sumRange(left,right); |
| 67 | + */ |
0 commit comments