Source code for titan_pylib.data_structures.set.dynamic_fenwick_tree_multiset

 1from titan_pylib.data_structures.set.dynamic_fenwick_tree_set import (
 2    DynamicFenwickTreeSet,
 3)
 4from typing import Iterable
 5
 6
[docs] 7class DynamicFenwickTreeMultiset(DynamicFenwickTreeSet): 8 9 def __init__(self, n: int, a: Iterable[int] = []) -> None: 10 super().__init__(n, a) 11
[docs] 12 def add(self, key: int, val: int = 1) -> None: 13 self._len += val 14 if key in self._cnt: 15 self._cnt[key] += val 16 else: 17 self._cnt[key] = val 18 self._fw.add(key, val)
19
[docs] 20 def discard(self, key: int, val: int = 1) -> bool: 21 if key not in self._cnt: 22 return False 23 cnt = self._cnt[key] 24 if val >= cnt: 25 self._len -= cnt 26 del self._cnt[key] 27 self._fw.add(key, -cnt) 28 else: 29 self._len -= val 30 self._cnt[key] -= val 31 self._fw.add(key, -val) 32 return True
33
[docs] 34 def discard_all(self, key: int) -> bool: 35 return self.discard(key, val=self.count(key))
36
[docs] 37 def count(self, key: int) -> int: 38 return self._cnt[key]
39
[docs] 40 def items(self) -> Iterable[tuple[int, int]]: 41 _iter = 0 42 while _iter < self._len: 43 res = self.__getitem__(_iter) 44 cnt = self.count(res) 45 _iter += cnt 46 yield res, cnt
47
[docs] 48 def show(self) -> None: 49 print("{" + ", ".join(f"{i[0]}: {i[1]}" for i in self.items()) + "}")
50 51 def __repr__(self): 52 return f"DynamicFenwickTreeMultiset({self})"