imashutosh51

Segment tree implementation

May 23rd, 2026
35
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.40 KB | None | 0 0
  1. import math
  2.  
  3. arr=[1,2,5,6,7,9]
  4. n=len(arr)
  5.  
  6. def build_segment_tree(seg_tree,seg_idx,arr,left,right):
  7.     if left==right:
  8.         seg_tree[seg_idx]=arr[left]
  9.         return seg_tree[seg_idx]
  10.        
  11.     mid=(left+right)//2
  12.     left_sum=build_segment_tree(seg_tree,2*seg_idx+1,arr,left,mid)
  13.     right_sum=build_segment_tree(seg_tree,2*seg_idx+2,arr,mid+1,right)
  14.     seg_tree[seg_idx]=left_sum+right_sum
  15.     return seg_tree[seg_idx]
  16.  
  17. def query(seg_tree,seg_idx,left,right,query_left,query_right):
  18.  
  19.     #complete overlap
  20.     if left>=query_left and right<=query_right:
  21.         return seg_tree[seg_idx]
  22.  
  23.     #no overlap
  24.     if right<query_left or left>query_right:
  25.         return 0
  26.  
  27.     mid=(left+right)//2
  28.     return query(seg_tree,2*seg_idx+1,left,mid,query_left,query_right)+query(seg_tree,2*seg_idx+2,mid+1,right,query_left,query_right)
  29.  
  30. def update(seg_tree,seg_idx,left,right,diff,idx):
  31.  
  32.     if idx<left or idx>right:
  33.         return
  34.  
  35.     seg_tree[seg_idx]+=diff
  36.     if left!=right:
  37.         mid=(left+right)//2
  38.         update(seg_tree,2*seg_idx+1,left,mid,diff,idx)
  39.         update(seg_tree,2*seg_idx+2,mid+1,right,diff,idx)
  40.    
  41.    
  42.  
  43. size=2*(1<<math.ceil(math.log2(n)))-1
  44. seg_tree=[0]*size
  45. build_segment_tree(seg_tree,0,arr,0,n-1)
  46. print(seg_tree)
  47. print(query(seg_tree,0,0,n-1,2,4))
  48. new_value_at_3rd_idx=14
  49. diff=new_value_at_3rd_idx-arr[3]
  50. arr[3]=14
  51. update(seg_tree,0,0,n-1,diff,3)
Advertisement
Add Comment
Please, Sign In to add comment