Source code for titan_pylib.data_structures.sparse_table.sparse_table_RmQ

 1from titan_pylib.my_class.supports_less_than import SupportsLessThan
 2from typing import Generic, TypeVar, Iterable
 3
 4T = TypeVar("T", bound=SupportsLessThan)
 5
 6
[docs] 7class SparseTableRmQ(Generic[T]): 8 """ 9 2項演算を :math:`\\min` にしたものです。 10 """ 11 12 def __init__(self, a: Iterable[T], e: T): 13 if not isinstance(a, list): 14 a = list(a) 15 self.size = len(a) 16 log = self.size.bit_length() - 1 17 data = [a] + [[]] * log 18 for i in range(log): 19 pre = data[i] 20 l = 1 << i 21 data[i + 1] = [ 22 pre[j] if pre[j] < pre[j + l] else pre[j + l] 23 for j in range(len(pre) - l) 24 ] 25 self.data = data 26 self.e = e 27
[docs] 28 def prod(self, l: int, r: int) -> T: 29 assert 0 <= l <= r <= self.size 30 if l == r: 31 return self.e 32 u = (r - l).bit_length() - 1 33 return ( 34 self.data[u][l] 35 if self.data[u][l] < self.data[u][r - (1 << u)] 36 else self.data[u][r - (1 << u)] 37 )
38 39 def __getitem__(self, k: int) -> T: 40 assert 0 <= k < self.size 41 return self.data[0][k] 42 43 def __len__(self): 44 return self.size 45 46 def __str__(self): 47 return str(self.data[0]) 48 49 def __repr__(self): 50 return f"{self.__class__.__name__}({self.data[0]}, {self.e})"