1
- class Node () :
1
+ class Node :
2
2
def __init__ (self , start , end ):
3
3
# Initializes a segment tree node with start and end indices
4
4
self .start = start
@@ -8,17 +8,17 @@ def __init__(self, start, end):
8
8
self .right = None
9
9
10
10
11
- class SegmentTree () :
12
- def __init__ (self , nums , mode = ' max' ):
11
+ class SegmentTree :
12
+ def __init__ (self , nums , mode = " max" ):
13
13
"""
14
14
Initializes the Segment Tree.
15
15
:param nums: List of integers to build the tree from.
16
16
:param mode: Operation mode of the tree ('max' or 'sum').
17
17
"""
18
18
self .siz = len (nums )
19
19
self .mode = mode
20
- if mode not in {' max' , ' sum' }:
21
- self .mode = ' max' # Default to max if invalid mode is given
20
+ if mode not in {" max" , " sum" }:
21
+ self .mode = " max" # Default to max if invalid mode is given
22
22
23
23
# Build the tree from the input list
24
24
self .root = self .build (0 , self .siz - 1 , nums )
@@ -39,14 +39,14 @@ def build(self, start, end, nums):
39
39
n = Node (start , end )
40
40
n .value = nums [start ]
41
41
return n
42
-
42
+
43
43
mid = (start + end ) // 2
44
44
root = Node (start , end )
45
45
root .left = self .build (start , mid , nums )
46
46
root .right = self .build (mid + 1 , end , nums )
47
47
48
48
# Set the value according to the mode
49
- if self .mode == ' max' :
49
+ if self .mode == " max" :
50
50
root .value = max (root .left .value , root .right .value )
51
51
else :
52
52
root .value = root .left .value + root .right .value
@@ -58,24 +58,24 @@ def max_in_range(self, start_index, end_index):
58
58
Queries the maximum value in a given range.
59
59
Only works in 'max' mode.
60
60
"""
61
- if self .mode == ' sum' :
62
- raise Exception (' Current Segment Tree doesn\ ' t support finding max' )
63
-
61
+ if self .mode == " sum" :
62
+ raise Exception (" Current Segment Tree doesn't support finding max" )
63
+
64
64
if start_index > end_index or start_index < 0 or end_index >= self .siz :
65
- raise Exception (' Invalid index' )
66
-
65
+ raise Exception (" Invalid index" )
66
+
67
67
return self .query (self .root , start_index , end_index , 0 , self .siz - 1 )
68
68
69
69
def sum_in_range (self , start_index , end_index ):
70
70
"""
71
71
Queries the sum of values in a given range.
72
72
Only works in 'sum' mode.
73
73
"""
74
- if self .mode == ' max' :
75
- raise Exception (' Current Segment Tree doesn\ ' t support summing' )
76
-
74
+ if self .mode == " max" :
75
+ raise Exception (" Current Segment Tree doesn't support summing" )
76
+
77
77
if start_index > end_index or start_index < 0 or end_index >= self .siz :
78
- raise Exception (' Invalid index' )
78
+ raise Exception (" Invalid index" )
79
79
80
80
return self .query (self .root , start_index , end_index , 0 , self .siz - 1 )
81
81
@@ -92,7 +92,7 @@ def query(self, node, start_index, end_index, start, end):
92
92
# Complete overlap
93
93
if start_index <= start and end <= end_index :
94
94
return node .value
95
-
95
+
96
96
mid = (start + end ) // 2
97
97
98
98
if end_index <= mid :
@@ -103,16 +103,15 @@ def query(self, node, start_index, end_index, start, end):
103
103
return self .query (node .right , start_index , end_index , mid + 1 , end )
104
104
else :
105
105
# Range spans both children
106
- if self .mode == ' max' :
106
+ if self .mode == " max" :
107
107
return max (
108
108
self .query (node .left , start_index , end_index , start , mid ),
109
- self .query (node .right , start_index , end_index , mid + 1 , end )
109
+ self .query (node .right , start_index , end_index , mid + 1 , end ),
110
110
)
111
111
else :
112
- return (
113
- self .query (node .left , start_index , end_index , start , mid ) +
114
- self .query (node .right , start_index , end_index , mid + 1 , end )
115
- )
112
+ return self .query (
113
+ node .left , start_index , end_index , start , mid
114
+ ) + self .query (node .right , start_index , end_index , mid + 1 , end )
116
115
117
116
def update (self , index , new_value ):
118
117
"""
@@ -121,8 +120,8 @@ def update(self, index, new_value):
121
120
:param new_value: New value to set.
122
121
"""
123
122
if index < 0 or index >= self .siz :
124
- raise Exception (' Invalid index' )
125
-
123
+ raise Exception (" Invalid index" )
124
+
126
125
self .modify (self .root , index , new_value , 0 , self .siz - 1 )
127
126
128
127
def modify (self , node , index , new_value , start , end ):
@@ -137,16 +136,16 @@ def modify(self, node, index, new_value, start, end):
137
136
if start == end :
138
137
node .value = new_value
139
138
return
140
-
139
+
141
140
mid = (start + end ) // 2
142
141
143
142
if index <= mid :
144
143
self .modify (node .left , index , new_value , start , mid )
145
144
else :
146
145
self .modify (node .right , index , new_value , mid + 1 , end )
147
-
146
+
148
147
# Recompute current node's value after update
149
- if self .mode == ' max' :
148
+ if self .mode == " max" :
150
149
node .value = max (node .left .value , node .right .value )
151
150
else :
152
151
node .value = node .left .value + node .right .value
@@ -201,4 +200,4 @@ def modify(self, node, index, new_value, start, end):
201
200
202
201
st_invalid = SegmentTree(nums, mode='unknown') # Should default to 'max'
203
202
print(st_invalid.mode) # Expected: 'max'
204
- """
203
+ """
0 commit comments