Range Minimum Query (Square Root Decomposition and Sparse Table)
import math
class Query:
def __init__(self):
self.f = None
def preprocess(self,arr):
n = len(arr)
k = int(math.floor(math.log(n,2)))
f = [[0]*k for _ in range(n)]
for i in range(n):
f[i][0] = i
i,j=0,1
while (1<<j) <=n:
while i+ (1<<j) - 1< n:
f[i][j] = f[i][j - 1] if arr[f[i][j-1]] < arr[f[i+(1<<(j-1))][j-1]] else f[i+(1<<(j-1))][j-1]
i+=1
j+=1
self.f = f
def query(self,arr, l,r):
k = int(math.floor(math.log(r-l+1,2)))
return arr[self.f[l][k]] if arr[self.f[l][k]] <= arr[self.f[r- (1<<k) +1][k]] else arr[self.f[r- (1<<k) +1][k]]
def RMQ(self,arr, queries):
self.preprocess(arr)
for q in queries:
print(self.query(arr,q[0],q[1]))Last updated