This documentation is automatically generated by online-judge-tools/verification-helper
import cp_library.__header__
from typing import Iterable
from cp_library.misc.typing import _T
import cp_library.ds.__header__
import cp_library.ds.heap.__header__
from cp_library.ds.heap.heapify_max_fn import heapify_max
from cp_library.ds.heap.heappop_max_fn import heappop_max
from cp_library.ds.heap.heappush_max_fn import heappush_max
from cp_library.ds.heap.heappushpop_max_fn import heappushpop_max
from cp_library.ds.heap.heapreplace_max_fn import heapreplace_max
from cp_library.ds.heap.heap_base_cls import HeapBase
class MaxHeap(HeapBase[_T]):
def __init__(self, iterable: Iterable[_T] = None): self.data = list(iterable) if iterable else []; heapify_max(self.data)
def pop(self): return heappop_max(self.data)
def push(self, item: _T): heappush_max(self.data, item)
def pushpop(self, item: _T): return heappushpop_max(self.data, item)
def replace(self, item: _T): return heapreplace_max(self.data, item)
'''
╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸
https://kobejean.github.io/cp-library
'''
from typing import Iterable
from typing import TypeVar
_S = TypeVar('S'); _T = TypeVar('T'); _U = TypeVar('U'); _T1 = TypeVar('T1'); _T2 = TypeVar('T2'); _T3 = TypeVar('T3'); _T4 = TypeVar('T4'); _T5 = TypeVar('T5'); _T6 = TypeVar('T6')
def heapsiftup_max(heap: list, pos: int):
n, item, c = len(heap)-1, heap[pos], pos<<1|1
while c < n and item < heap[c := c+(heap[c]<heap[c+1])]: heap[pos], pos, c = heap[c], c, c<<1|1
if c == n and item < heap[c]: heap[pos], pos = heap[c], c
heap[pos] = item
def heapify_max(x: list):
for i in reversed(range(len(x)//2)): heapsiftup_max(x, i)
def heappop_max(heap: list):
item = heap.pop()
if heap: item, heap[0] = heap[0], item; heapsiftup_max(heap, 0)
return item
def heapsiftdown_max(heap: list, root: int, pos: int):
item = heap[pos]
while root < pos and heap[p := (pos-1)>>1] < item: heap[pos], pos = heap[p], p
heap[pos] = item
def heappush_max(heap: list, item):
heap.append(item); heapsiftdown_max(heap, 0, len(heap)-1)
def heappushpop_max(heap: list, item):
if heap and heap[0] > item: item, heap[0] = heap[0], item; heapsiftup_max(heap, 0)
return item
def heapreplace_max(heap: list, item):
item, heap[0] = heap[0], item; heapsiftup_max(heap, 0)
return item
from typing import Generic
class HeapBase(Generic[_T]):
def peek(heap) -> _T: return heap.data[0]
def pop(heap) -> _T: ...
def push(heap, item: _T): ...
def pushpop(heap, item: _T) -> _T: ...
def replace(heap, item: _T) -> _T: ...
def __contains__(heap, item: _T): return item in heap.data
def __len__(heap): return len(heap.data)
def clear(heap): heap.data.clear()
class MaxHeap(HeapBase[_T]):
def __init__(self, iterable: Iterable[_T] = None): self.data = list(iterable) if iterable else []; heapify_max(self.data)
def pop(self): return heappop_max(self.data)
def push(self, item: _T): heappush_max(self.data, item)
def pushpop(self, item: _T): return heappushpop_max(self.data, item)
def replace(self, item: _T): return heapreplace_max(self.data, item)