結果
| 問題 |
No.649 ここでちょっとQK!
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-06-20 18:12:51 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 537 ms / 3,000 ms |
| コード長 | 1,915 bytes |
| コンパイル時間 | 158 ms |
| コンパイル使用メモリ | 82,072 KB |
| 実行使用メモリ | 253,040 KB |
| 最終ジャッジ日時 | 2024-10-13 06:10:35 |
| 合計ジャッジ時間 | 9,421 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 32 |
ソースコード
import sys
input = lambda: sys.stdin.readline().rstrip()
class FenwickTree:
def __init__(self, n: int):
"Build a new fenwick tree. / O(N)"
assert 0 <= n <= 10**8
self._size = n
self._tree = [0] * (n+1)
self._depth = n.bit_length()
def _sum(self, i):
"Return sum([0, i)) of a. / O(logN)"
i += 1 # 1-indexed
ret = 0
while i > 0:
ret += self._tree[i]
i -= i & -i
return ret
def sum(self, l: int, r: int):
"Return sum([l, r)] of a. / O(logN)"
assert 0 <= l <= r <= self._size
return self._sum(r-1) - self._sum(l-1)
def add(self, p: int, x) -> None:
"Add x to a[p]. / O(logN)"
p += 1 # 1-indexed.
assert 1 <= p <= self._size
while p <= self._size:
self._tree[p] += x
p += p & -p
return
def lower_bound(self, w):
"Return 累積和がx以上になる最小のindexと、その直前までの累積和 / O(logN)"
'''
FenwickTreeを集合として管理
add(a, 1) -> 集合にaを追加
add(a,-1) -> 集合からaを削除
sum(a) -> aが何番目に小さいかを返す
lower_bound(w) -> w番目に小さい要素を返す
'''
acc, pos = 0, 0
for i in range(self._depth, -1, -1):
k = pos + (1 << i)
if k <= self._size and acc + self._tree[k] < w:
acc += self._tree[k]
pos += 1 << i
return pos+1, acc
##################
Q, K = map(int, input().split())
qu = [list(map(int, input().split())) for _ in range(Q)]
A = []
for q in qu:
if q[0] == 1:
v = q[1]
A.append(v)
dictonum = {x:i for i,x in enumerate(sorted(list(set(A))))}
dictox = {i:x for i,x in enumerate(sorted(list(set(A))))}
n = len(A)
fw = FenwickTree(n)
for q in qu:
if q[0] == 1:
v = dictonum[q[1]]
fw.add(v, 1)
else:
if fw.sum(0, n) < K:
print(-1)
else:
w = fw.lower_bound(K)[0]
print(dictox[w-1])
fw.add(w-1, -1)