Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import math
- arr=[1,2,5,6,7,9]
- n=len(arr)
- def build_segment_tree(seg_tree,seg_idx,arr,left,right):
- if left==right:
- seg_tree[seg_idx]=arr[left]
- return seg_tree[seg_idx]
- mid=(left+right)//2
- left_sum=build_segment_tree(seg_tree,2*seg_idx+1,arr,left,mid)
- right_sum=build_segment_tree(seg_tree,2*seg_idx+2,arr,mid+1,right)
- seg_tree[seg_idx]=left_sum+right_sum
- return seg_tree[seg_idx]
- def query(seg_tree,seg_idx,left,right,query_left,query_right):
- #complete overlap
- if left>=query_left and right<=query_right:
- return seg_tree[seg_idx]
- #no overlap
- if right<query_left or left>query_right:
- return 0
- mid=(left+right)//2
- 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)
- def update(seg_tree,seg_idx,left,right,diff,idx):
- if idx<left or idx>right:
- return
- seg_tree[seg_idx]+=diff
- if left!=right:
- mid=(left+right)//2
- update(seg_tree,2*seg_idx+1,left,mid,diff,idx)
- update(seg_tree,2*seg_idx+2,mid+1,right,diff,idx)
- size=2*(1<<math.ceil(math.log2(n)))-1
- seg_tree=[0]*size
- build_segment_tree(seg_tree,0,arr,0,n-1)
- print(seg_tree)
- print(query(seg_tree,0,0,n-1,2,4))
- new_value_at_3rd_idx=14
- diff=new_value_at_3rd_idx-arr[3]
- arr[3]=14
- update(seg_tree,0,0,n-1,diff,3)
Advertisement
Add Comment
Please, Sign In to add comment