結果
| 問題 | 
                            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)
            
            
            
        
            
るこーそー