Use this to learn the idea, then write your own version.
12 345import math6from bisect import bisect_left, bisect_right7from typing import ClassVar, Generator, Optional8 9 10class SortedMultiset[T]:11 size: int12 a: list[list[T]]13 BUCKET_RATIO: ClassVar[int] = 1614 SPLIT_RATIO: ClassVar[int] = 2415 16 def __init__(self) -> None:17 self.size = 018 self.a = []19 20 def __init__(self, a: Generator[T]) -> None:21 self.__init__(list(a))22 23 def __init__(self, a: list[T]) -> None:24 "Make a new SortedMultiset from a list. / O(N) if sorted / O(N log N)"25 n = self.size = len(a)26 if any(a[i] > a[i + 1] for i in range(n - 1)):27 a.sort()28 num_bucket = int(math.ceil(math.sqrt(n / self.BUCKET_RATIO)))29 self.a = [30 a[n * i num_bucket : n * (i + 1) num_bucket]31 for i in range(num_bucket)32 ]33 34 def __iter__(self) -> Generator[T]:35 for i in self.a:36 for j in i:37 yield j38 39 def __reversed__(self) -> Generator[T]:40 for i in reversed(self.a):41 for j in reversed(i):42 yield j43 44 def __eq__(self, other: SortedMultiset[T]) -> bool:45 if len(self) != len(other):46 return False47 for x, y in zip(self, other):48 if x != y:49 return False50 return True51 52 def __ne__(self, other: SortedMultiset[T]) -> bool:53 return not self.__eq__(other)54 55 def __len__(self) -> int:56 return self.size57 58 def __bool__(self) -> bool:59 return self.size > 060 61 def __repr__(self) -> str:62 return "SortedMultiset" + str(self.a)63 64 def __str__(self) -> str:65 s = str(list(self))66 return "{" + s[1 : len(s) - 1] + "}"67 68 def _position(self, x: T) -> tuple[list[T], int, int]:69 "return the bucket, index of the bucket and position in which x should be. self must not be empty."70 for i, a in enumerate(self.a):71 if x <= a[-1]:72 break73 return (a, i, bisect_left(a, x))74 75 def __contains__(self, x: T) -> bool:76 if self.size == 0:77 return False78 a, _, i = self._position(x)79 return i != len(a) and a[i] == x80 81 def count(self, x: T) -> int:82 "Count the number of x."83 return self.index_right(x) - self.index(x)84 85 def add(self, x: T) -> None:86 "Add an element. / O(√N)"87 if self.size == 0:88 self.a = [[x]]89 self.size = 190 return91 a, b, i = self._position(x)92 a.insert(i, x)93 self.size += 194 if len(a) > len(self.a) * self.SPLIT_RATIO:95 mid = len(a) >> 196 self.a[b : b + 1] = [a[:mid], a[mid:]]97 98 def _pop(self, a: list[T], b: int, i: int) -> T:99 ans = a.pop(i)100 self.size -= 1101 if not a:102 del self.a[b]103 return ans104 105 def discard(self, x: T) -> bool:106 "Remove an element and return True if removed. / O(√N)"107 if self.size == 0:108 return False109 a, b, i = self._position(x)110 if i == len(a) or a[i] != x:111 return False112 self._pop(a, b, i)113 return True114 115 def lt(self, x: T) -> Optional[T]:116 "Find the largest element < x, or None if it doesn't exist."117 for a in reversed(self.a):118 if a[0] < x:119 return a[bisect_left(a, x) - 1]120 121 def le(self, x: T) -> Optional[T]:122 "Find the largest element <= x, or None if it doesn't exist."123 for a in reversed(self.a):124 if a[0] <= x:125 return a[bisect_right(a, x) - 1]126 127 def gt(self, x: T) -> Optional[T]:128 "Find the smallest element > x, or None if it doesn't exist."129 for a in self.a:130 if a[-1] > x:131 return a[bisect_right(a, x)]132 133 def ge(self, x: T) -> Optional[T]:134 "Find the smallest element >= x, or None if it doesn't exist."135 for a in self.a:136 if a[-1] >= x:137 return a[bisect_left(a, x)]138 139 def __getitem__(self, i: int) -> T:140 "Return the i-th element."141 if i < 0:142 for a in reversed(self.a):143 i += len(a)144 if i >= 0:145 return a[i]146 else:147 for a in self.a:148 if i < len(a):149 return a[i]150 i -= len(a)151 raise IndexError("index out of range")152 153 def pop(self, i: int = -1) -> T:154 "Pop and return the i-th element."155 if i < 0:156 for b, a in enumerate(reversed(self.a)):157 i += len(a)158 if i >= 0:159 return self._pop(a, ~b, i)160 else:161 for b, a in enumerate(self.a):162 if i < len(a):163 return self._pop(a, b, i)164 i -= len(a)165 raise IndexError("index out of range")166 167 def index(self, x: T) -> int:168 "Count the number of elements < x."169 ans = 0170 for a in self.a:171 if a[-1] >= x:172 return ans + bisect_left(a, x)173 ans += len(a)174 return ans175 176 def index_right(self, x: T) -> int:177 "Count the number of elements <= x."178 ans = 0179 for a in self.a:180 if a[-1] > x:181 return ans + bisect_right(a, x)182 ans += len(a)183 return ans184 185 186def main():187 n, q = list(map(int, input().split()))188 counts = [0] * n189 st = SortedMultiset([0] * n)190 ans = list()191 192 for _ in range(q):193 query, value = list(map(int, input().split()))194 195 if query == 1:196 value -= 1197 198 st.discard(counts[value])199 counts[value] += 1200 st.add(counts[value])201 else:202 add = st[0]203 result = n - st.index(value + add)204 ans.append(result)205 206 for ans_i in ans:207 print(ans)208 209 210if __name__ == "__main__":211 main()212