12
12
"""
13
13
14
14
15
- def build_sparse_table (arr : list [int ], n : int ) -> list [int ]:
15
+ def build_sparse_table (arr : list [int ], arr_length : int ) -> list [int ]:
16
16
"""
17
17
Precompute range minimum queries with power of two length
18
18
and store the precomputed values in a table.
@@ -32,18 +32,18 @@ def build_sparse_table(arr: list[int], n: int) -> list[int]:
32
32
raise ValueError ("math domain error" )
33
33
34
34
# Initialise lookup table
35
- k = int (math .log2 (n )) + 1
36
- lookup = [[0 for i in range (n )] for j in range (k )]
35
+ k = int (math .log2 (arr_length )) + 1
36
+ lookup = [[0 for i in range (arr_length )] for j in range (k )]
37
37
38
- for i in range (0 , n ):
38
+ for i in range (0 , arr_length ):
39
39
lookup [0 ][i ] = arr [i ]
40
40
41
41
j = 1
42
42
43
- while (1 << j ) <= n :
43
+ while (1 << j ) <= arr_length :
44
44
# Compute the minimum value for all intervals with size (2 ** j)
45
45
i = 0
46
- while (i + (1 << j ) - 1 ) < n :
46
+ while (i + (1 << j ) - 1 ) < arr_length :
47
47
lookup [j ][i ] = min (lookup [j - 1 ][i + (1 << (j - 1 ))], lookup [j - 1 ][i ])
48
48
i += 1
49
49
@@ -52,7 +52,7 @@ def build_sparse_table(arr: list[int], n: int) -> list[int]:
52
52
return lookup
53
53
54
54
55
- def query (lookup : list [int ], L : int , R : int ) -> int :
55
+ def query (lookup : list [int ], left_bound : int , right_bound : int ) -> int :
56
56
"""
57
57
>>> query(build_sparse_table([8, 1, 0, 3, 4, 9, 3], 7), 0, 4)
58
58
0
@@ -77,15 +77,15 @@ def query(lookup: list[int], L: int, R: int) -> int:
77
77
78
78
if lookup == []:
79
79
raise ValueError ("math domain error" )
80
- if L < 0 or R >= len (lookup [0 ]):
80
+ if left_bound < 0 or right_bound >= len (lookup [0 ]):
81
81
raise IndexError ("list index out of range" )
82
82
83
83
"""
84
84
Find the highest power of 2
85
85
that is at least the number of elements in a given range.
86
86
"""
87
- j = int (math .log2 (R - L + 1 ))
88
- return min (lookup [j ][R - (1 << j ) + 1 ], lookup [j ][L ])
87
+ j = int (math .log2 (right_bound - left_bound + 1 ))
88
+ return min (lookup [j ][right_bound - (1 << j ) + 1 ], lookup [j ][left_bound ])
89
89
90
90
91
91
if __name__ == "__main__" :
0 commit comments