Advertisement
Sunilsai

Segment Tree Range Minimum

May 19th, 2022
20
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.95 KB | None | 0 0
  1. class MinSegmentTree:
  2.    
  3.     def __init__(self, InArr):
  4.         self.InArr = InArr
  5.         self.SegTree = [-1]*(4*len(InArr))
  6.         def BuildSegTree(Root, Start, End):
  7.             if(Start == End):
  8.                 self.SegTree[Root] = self.InArr[Start]
  9.                 return
  10.             Mid = (Start + End)//2
  11.             BuildSegTree((Root*2)+1, Start, Mid)
  12.             BuildSegTree((Root*2)+2, Mid+1, End)
  13.             self.SegTree[Root] = min(self.SegTree[(Root*2)+1], self.SegTree[(Root*2)+2])
  14.            
  15.         BuildSegTree(0, 0, len(InArr)-1)
  16.        
  17.     def RangeMinimum(self, Left, Right):
  18.         def FindRangeMin(Root, Left, Right, Start, End):
  19.             if(Start > Right or End < Left):
  20.                 return float('inf')
  21.             elif(Start >= Left and End <= Right):
  22.                 return self.SegTree[Root]
  23.             Mid = (Start + End)//2
  24.             LVal = FindRangeMin((Root*2)+1, Left, Right, Start, Mid)
  25.             RVal = FindRangeMin((Root*2)+2, Left, Right, Mid+1, End)
  26.             return min(LVal, RVal)
  27.            
  28.         return FindRangeMin(0, Left, Right, 0, len(self.InArr)-1)
  29.        
  30.    
  31.     def UpdateIndex(self, Ind, Val):
  32.         def UpdateSegTree(Root, Start, End, Ind, Val):
  33.             if(Start == End):
  34.                 self.SegTree[Root] = Val
  35.                 return
  36.             Mid = (Start + End)//2
  37.             if(Ind <= Mid):
  38.                 UpdateSegTree((Root*2)+1, Start, Mid, Ind, Val)
  39.             else:
  40.                 UpdateSegTree((Root*2)+2, Mid+1, End, Ind, Val)
  41.             self.SegTree[Root] = min(self.SegTree[(Root*2)+1], self.SegTree[(Root*2)+2])
  42.         UpdateSegTree(0, 0, len(self.InArr)-1, Ind, Val)
  43.        
  44.    
  45. #Arr = [1,3,2,6,7,9,0,2,3,7]
  46. Arr = [7,3,9,0,1]
  47. Obj = MinSegmentTree(Arr)
  48. print(Obj.SegTree)
  49. print(Obj.RangeMinimum(0, 3))
  50. print(Obj.RangeMinimum(0, 2))
  51. Obj.UpdateIndex(3, 10)
  52. print(Obj.SegTree)
  53. print(Obj.RangeMinimum(0, 3))
  54. print(Obj.RangeMinimum(0, 2))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement