Advertisement
Guest User

Range Sum Query - Mutable

a guest
Oct 19th, 2019
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.09 KB | None | 0 0
  1. class NumArray:
  2.  
  3.     def __init__(self, nums: List[int]):
  4.         n = len(nums)
  5.         if n > 0:
  6.             next_power2 = self.get_next_power2(n)
  7.             self.tree = [0] * (next_power2 * 2 - 1)
  8.             self.start = 0
  9.             self.end = n - 1
  10.             self.build_tree(self.start, self.end, 0, nums)
  11.             self.arr = nums
  12.  
  13.     def get_next_power2(self, n):
  14.         cnt = 0
  15.         while n > 0:
  16.             n >>= 1
  17.             cnt += 1
  18.         return 1 << cnt
  19.  
  20.     def build_tree(self, start, end, i, arr):
  21.         if start == end:
  22.             self.tree[i] = arr[start]
  23.             return self.tree[i]
  24.        
  25.         mid = (start + end) // 2
  26.         self.tree[i] = self.build_tree(start, mid, i*2+1, arr) + self.build_tree(mid+1, end, i*2+2, arr)
  27.        
  28.         return self.tree[i]
  29.  
  30.     def update(self, i: int, val: int) -> None:
  31.         diff = val - self.arr[i]
  32.         self.arr[i] = val
  33.         self.update_tree(self.start, self.end, 0, i, diff)
  34.  
  35.     def update_tree(self, start, end, tree_i, arr_i, diff):
  36.        
  37.         self.tree[tree_i] += diff
  38.        
  39.         if start == end:
  40.             return 0      
  41.        
  42.         mid = (start + end) // 2
  43.        
  44.         if arr_i <= mid:
  45.             self.update_tree(start, mid, tree_i*2+1, arr_i, diff)
  46.         else:
  47.             self.update_tree(mid+1, end, tree_i*2+2, arr_i, diff)
  48.        
  49.         return 0
  50.  
  51.     def sumRange(self, i: int, j: int) -> int:
  52.         return self.get_range_sum(self.start, self.end, 0, i, j)
  53.  
  54.     def get_range_sum(self, start, end, i, range_start, range_end):
  55.        
  56.         if start >= range_start and end <= range_end:
  57.             return self.tree[i]
  58.        
  59.         if start > range_end or end < range_start:
  60.             return 0
  61.        
  62.         mid = (start + end) // 2
  63.        
  64.         return self.get_range_sum(start, mid, i*2+1, range_start, range_end) + self.get_range_sum(mid+1, end, i*2+2, range_start, range_end)
  65.  
  66. # Your NumArray object will be instantiated and called as such:
  67. # obj = NumArray(nums)
  68. # obj.update(i,val)
  69. # param_2 = obj.sumRange(i,j)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement