結果
問題 |
No.649 ここでちょっとQK!
|
ユーザー |
![]() |
提出日時 | 2024-11-14 15:24:31 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,167 bytes |
コンパイル時間 | 405 ms |
コンパイル使用メモリ | 82,432 KB |
実行使用メモリ | 280,632 KB |
最終ジャッジ日時 | 2024-11-14 15:25:43 |
合計ジャッジ時間 | 65,017 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 23 TLE * 9 |
ソースコード
import random import sys sys.setrecursionlimit(10**5) class Node: def __init__(self, v): self.v = v self.sum = v self.l = None self.r = None self.cnt = 1 class RBST: def __init__(self): self.root = None def size(self, t): return 0 if t is None else t.cnt def sum(self, t): return 0 if t is None else t.sum def update(self, t): if t: t.cnt = 1 + self.size(t.l) + self.size(t.r) t.sum = t.v + self.sum(t.l) + self.sum(t.r) return t def merge(self, l, r): if not l or not r: return r if not l else l if random.randint(0, self.size(l) + self.size(r) - 1) < self.size(l): l.r = self.merge(l.r, r) return self.update(l) else: r.l = self.merge(l, r.l) return self.update(r) def split(self, t, v): if not t: return None, None if v <= t.v: s1, s2 = self.split(t.l, v) t.l = s2 return s1, self.update(t) else: s1, s2 = self.split(t.r, v) t.r = s1 return self.update(t), s2 def _insert(self, t, v): s1, s2 = self.split(t, v) n = Node(v) return self.merge(self.merge(s1, n), s2) def _erase(self, t, v): s1, s2 = self.split(t, v + 1) s3, _ = self.split(s1, v) return self.merge(s3, s2) def _discard(self, t, v): if not t: return None if v < t.v: t.l = self._discard(t.l, v) elif t.v < v: t.r = self._discard(t.r, v) else: return self.merge(t.l, t.r) return self.update(t) def _lower_bound(self, t, k): if not t: return 0 if t.v < k: return self.size(t.l) + 1 + self._lower_bound(t.r, k) else: return self._lower_bound(t.l, k) def _upper_bound(self, t, k): if not t: return 0 if t.v <= k: return self.size(t.l) + 1 + self._upper_bound(t.r, k) else: return self._upper_bound(t.l, k) def _get(self, t, k): s = self.size(t.l) if s > k: return self._get(t.l, k) elif s < k: return self._get(t.r, k - s - 1) else: return t.v def insert(self, v): self.root = self._insert(self.root, v) def erase(self, v): self.root = self._erase(self.root, v) def discard(self, v): self.root = self._discard(self.root, v) def get(self, k): return self._get(self.root, k) def lower_bound(self, k): return self._lower_bound(self.root, k) def upper_bound(self, k): return self._upper_bound(self.root, k) def __getitem__(self,k): return self.get(k) rbst = RBST() q ,k = map(int,input().split()) for i in range(q): query=list(map(int,input().split())) if query[0]==1: v=query[1] rbst.insert(v) else: if k<=rbst.size(rbst.root): print(rbst[k-1]) rbst.discard(rbst[k-1]) else: print(-1)