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