Skip to content

Commit 6990562

Browse files
authored
Merge pull request prabhupant#358 from durid17/MaxSegTree
MaxSegTree
2 parents c95fd1f + 4f8199d commit 6990562

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import sys
2+
3+
class MaxSegTree():
4+
5+
def __init__(self, n, arr = None):
6+
self._t = [-sys.maxsize - 1] * (4 * n)
7+
self._n = n
8+
if arr: self._build(arr, 1 , 0 , n - 1)
9+
10+
def _build(self, a, v, tl, tr):
11+
if tl == tr:
12+
self._t[v] = a[tl]
13+
else:
14+
tm = (tl + tr) // 2
15+
self._build(a, v*2, tl, tm)
16+
self._build(a, v*2+1, tm+1, tr)
17+
self._t[v] = max(self._t[v*2] ,self._t[v*2+1])
18+
19+
def _max_util(self, v, tl, tr, l, r):
20+
if l > r: return -sys.maxsize - 1
21+
22+
if l == tl and r == tr : return self._t[v]
23+
24+
tm = (tl + tr) // 2
25+
return max(self._max_util(v*2, tl, tm, l, min(r, tm)) ,self._max_util(v*2+1, tm+1, tr, max(l, tm+1), r))
26+
27+
def _update_util(self, v, tl, tr, pos, new_val):
28+
if tl == tr:
29+
self._t[v] = new_val
30+
else:
31+
tm = (tl + tr) // 2
32+
if pos <= tm: self._update_util(v*2, tl, tm, pos, new_val)
33+
else: self._update_util(v*2+1, tm+1, tr, pos, new_val)
34+
self._t[v] = max(self._t[v*2] , self._t[v*2+1])
35+
36+
def max_element(self, l, r):
37+
return self._max_util(1 , 0 , self._n - 1 , l , r)
38+
39+
def update(self, pos, new_val):
40+
self._update_util(1 , 0 , self._n - 1 , pos , new_val)
41+
42+
def add(self, pos, change):
43+
value = self.max_element(pos , pos)
44+
self._update_util(1 , 0 , self._n - 1 , pos , value + change)

0 commit comments

Comments
 (0)