Submission #10042602
Source Code Expand
import random
random.seed()
class RBST:
def __init__(self):
self.root = None
def find(self, x):
node = self.root
while node:
v = node[2]
if v == x:
return 1
node = node[v < x]
return 0
def at(self, k):
node = self.root
k += 1
while 1:
v = (node[0][3]+1 if node[0] else 1)
if v == k:
return node[2]
if k < v:
node = node[0]
else:
k -= v
node = node[1]
return -1
def insert(self, x):
rand = random.random
new_node = [None, None, x, 1]
if not self.root:
self.root = new_node
return
node = self.root
prv = None
while node:
if node[3] == int(rand() * (node[3]+1)):
break
node[3] += 1
prv = node
node = node[node[2] < x]
if prv:
prv[prv[2] < x] = new_node
else:
self.root = new_node
left = right = new_node
st = []
while node:
st.append(node)
if node[2] < x:
left[1] = left = node
node = node[1]
else:
right[0] = right = node
node = node[0]
left[1] = right[0] = None
new_node[0], new_node[1] = new_node[1], new_node[0]
st.reverse()
for node in st:
l, r = node[:2]
node[3] = (l[3] if l else 0) + (r[3] if r else 0) + 1
l, r = new_node[:2]
new_node[3] = (l[3] if l else 0) + (r[3] if r else 0) + 1
def remove(self, x):
rand = random.random
node = self.root
prt = None
while node[2] != x:
node[3] -= 1
prt = node
node = node[node[2] < x]
cur = top = prt
if prt:
prv_d = (prt[1] == node)
else:
cur = top = [None]
prv_d = 0
left, right = node[:2]
st = []; push = st.append
while left and right:
a = left[3]; b = right[3]
if int(rand() * (a+b)) < a:
push(left)
cur[prv_d] = cur = left
left = left[1]
prv_d = 1
else:
push(right)
cur[prv_d] = cur = right
right = right[0]
prv_d = 0
rest = left or right
cur[prv_d] = rest
if not prt:
self.root = top[0]
st.reverse()
for node in st:
l, r = node[:2]
node[3] = (l[3] if l else 0) + (r[3] if r else 0) + 1
def pop(self, k):
rand = random.random
node = self.root
prt = None
k += 1
while 1:
l = node[0]
v = (l[3]+1 if l else 1)
if v == k:
break
prt = node
node[3] -= 1
if k < v:
node = node[0]
else:
k -= v
node = node[1]
r_node = node
cur = top = prt
if prt:
prv_d = (prt[1] == node)
else:
cur = top = [None]
prv_d = 0
left, right = node[:2]
st = []; push = st.append
while left and right:
a = left[3]; b = right[3]
if int(rand() * (a+b)) < a:
push(left)
cur[prv_d] = cur = left
left = left[1]
prv_d = 1
else:
push(right)
cur[prv_d] = cur = right
right = right[0]
prv_d = 0
rest = left or right
cur[prv_d] = rest
if not prt:
self.root = top[0]
st.reverse()
for node in st:
l, r = node[:2]
node[3] = (l[3] if l else 0) + (r[3] if r else 0) + 1
return r_node[2]
import sys
readline = sys.stdin.readline
writelines = sys.stdout.writelines
tree = RBST()
Q = int(readline())
ans = []
for i in range(Q):
t, x = map(int, readline().split())
if t == 1:
tree.insert(x)
else:
ans.append("%d\n" % tree.pop(x-1))
writelines(ans)
Submission Info
| Submission Time | |
|---|---|
| Task | C - データ構造 |
| User | yaketake08 |
| Language | PyPy3 (2.4.0) |
| Score | 100 |
| Code Size | 4507 Byte |
| Status | AC |
| Exec Time | 1292 ms |
| Memory | 98780 KiB |
Judge Result
| Set Name | Sample | All | ||||
|---|---|---|---|---|---|---|
| Score / Max Score | 0 / 0 | 100 / 100 | ||||
| Status |
|
|
| Set Name | Test Cases |
|---|---|
| Sample | sample_01.txt, sample_02.txt |
| All | sample_01.txt, sample_02.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| sample_01.txt | AC | 174 ms | 39664 KiB |
| sample_02.txt | AC | 173 ms | 39664 KiB |
| subtask1_01.txt | AC | 173 ms | 39664 KiB |
| subtask1_02.txt | AC | 174 ms | 39664 KiB |
| subtask1_03.txt | AC | 177 ms | 39664 KiB |
| subtask1_04.txt | AC | 418 ms | 57436 KiB |
| subtask1_05.txt | AC | 470 ms | 60508 KiB |
| subtask1_06.txt | AC | 184 ms | 40432 KiB |
| subtask1_07.txt | AC | 832 ms | 78428 KiB |
| subtask1_08.txt | AC | 955 ms | 78044 KiB |
| subtask1_09.txt | AC | 1045 ms | 84188 KiB |
| subtask1_10.txt | AC | 1292 ms | 98780 KiB |
| subtask1_11.txt | AC | 1228 ms | 95324 KiB |
| subtask1_12.txt | AC | 1104 ms | 92380 KiB |
| subtask1_13.txt | AC | 1259 ms | 96860 KiB |
| subtask1_14.txt | AC | 1257 ms | 96220 KiB |
| subtask1_15.txt | AC | 746 ms | 78044 KiB |
| subtask1_16.txt | AC | 904 ms | 80860 KiB |