1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
| INF = 0x7fffffff cont = 0
class Node: def __init__(self,val=0,siz=0,cnt=0,ls=0,rs=0): self.val = val self.siz = siz self.cnt = cnt self.ls = ls self.rs = rs
tree = [Node() for _ in range(100000)]
def add(x,v): global cont,tree tree[x].siz += 1 if tree[x].val == v: tree[x].cnt += 1 return
if tree[x].val > v: if tree[x].ls != 0: add(tree[x].ls,v) else: cont += 1 tree[cont].val = v tree[cont].siz = tree[cont].cnt = 1 tree[x].ls = cont else: if tree[x].rs != 0: add(tree[x].rs,v) else: cont += 1 tree[cont].val = v tree[cont].siz = tree[cont].cnt = 1 tree[x].rs = cont
def queryfr(x,val,ans): global tree if tree[x].val >= val: if tree[x].ls == 0: return ans else: return queryfr(tree[x].ls,val,ans) else: if tree[x].rs == 0: if tree[x].val < val: return tree[x].val else: return ans if tree[x].cnt != 0: return queryfr(tree[x].rs,val,tree[x].val) else: return queryfr(tree[x],val,ans)
def queryne(x,val,ans): global tree if tree[x].val <= val: if tree[x].rs == 0: return ans else: return queryne(tree[x].rs,val,ans) else: if tree[x].ls == 0: if tree[x].val > val: return tree[x].val else: return ans if tree[x].cnt != 0: return queryne(tree[x].ls,val,tree[x].val) else: return queryne(tree[x].ls, val,ans)
def queryrk(x,rk): global tree if x == 0: return INF if tree[tree[x].ls].siz >= rk: return queryrk(tree[x].ls,rk) if tree[tree[x].ls].siz + tree[x].cnt >= rk: return tree[x].val return queryrk(tree[x].rs,rk - tree[tree[x].ls].siz-tree[x].cnt)
def queryval(x,val): global tree if x == 0: return 0 if val == tree[x].val: return tree[tree[x].ls].siz if val < tree[x].val: return queryval(tree[x].ls,val) return queryval(tree[x].rs,val)+tree[tree[x].ls].siz+tree[x].cnt
n = int(input()) for i in range(n): q,v = [int(x) for x in input().split()] if q == 5: if cont == 0: cont += 1 tree[cont].cnt = tree[cont].siz = 1 tree[cont].val = v else: add(1,v) elif q == 1: print(queryval(1,v)+1) elif q == 2: print(queryrk(1,v)) elif q == 3: print(queryfr(1,v,-INF)) elif q == 4: print(queryne(1,v,INF))
|