結果
| 問題 |
No.649 ここでちょっとQK!
|
| コンテスト | |
| ユーザー |
kazuma
|
| 提出日時 | 2018-04-03 21:57:00 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
RE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 3,038 bytes |
| コンパイル時間 | 2,287 ms |
| コンパイル使用メモリ | 198,172 KB |
| 最終ジャッジ日時 | 2025-01-05 09:53:05 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 RE * 2 |
| other | AC * 11 RE * 21 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template <typename T>
class avl_tree {
struct node {
T val;
node *ch[2];
int dep, size;
node(T v, node* l = nullptr, node* r = nullptr) : val(v), dep(1), size(1) {
ch[0] = l; ch[1] = r;
}
};
int depth(node *t) { return t == nullptr ? 0 : t->dep; }
int count(node *t) { return t == nullptr ? 0 : t->size; }
node *update(node *t) {
t->dep = max(depth(t->ch[0]), depth(t->ch[1])) + 1;
t->size = count(t->ch[0]) + count(t->ch[1]) + 1;
return t;
}
node *rotate(node *t, int b) {
node *s = t->ch[1 - b];
t->ch[1 - b] = s->ch[b];
s->ch[b] = t;
t = update(t);
s = update(s);
return s;
}
node *fetch(node *t) {
if (t == nullptr) return t;
if (depth(t->ch[0]) - depth(t->ch[1]) == 2) {
if (depth(t->ch[0]->ch[1]) > depth(t->ch[0]->ch[0])) {
t->ch[0] = rotate(t->ch[0], 0);
}
t = rotate(t, 1);
}
else if (depth(t->ch[0]) - depth(t->ch[1]) == -2) {
if (depth(t->ch[1]->ch[0]) > depth(t->ch[1]->ch[1])) {
t->ch[1] = rotate(t->ch[1], 1);
}
t = rotate(t, 0);
}
return t;
}
node *insert(node *t, int k, T v) {
if (t == nullptr) return new node(v);
int c = count(t->ch[0]), b = (k > c);
t->ch[b] = insert(t->ch[b], k - (b ? (c + 1) : 0), v);
update(t);
return fetch(t);
}
node *erase(node *t) {
if (t == nullptr) return nullptr;
if (t->ch[0] == nullptr && t->ch[1] == nullptr) {
delete t;
return nullptr;
}
if (t->ch[0] == nullptr || t->ch[1] == nullptr) {
node *res = t->ch[t->ch[0] == nullptr];
delete t;
return res;
}
node *res = new node(find(t->ch[1], 0)->val, t->ch[0], erase(t->ch[1], 0));
delete t;
return fetch(update(res));
}
node *erase(node *t, int k) {
if (t == nullptr) return nullptr;
int c = count(t->ch[0]);
if (k < c) {
t->ch[0] = erase(t->ch[0], k);
t = update(t);
}
else if (k > c) {
t->ch[1] = erase(t->ch[1], k - (c + 1));
t = update(t);
}
else {
t = erase(t);
}
return fetch(t);
}
node *find(node *t, int k) {
if (t == nullptr) return t;
int c = count(t->ch[0]);
return k < c ? find(t->ch[0], k) : k == c ? t : find(t->ch[1], k - (c + 1));
}
int cnt(node *t, T v) {
if (t == nullptr) return 0;
if (t->val < v) return count(t->ch[0]) + 1 + cnt(t->ch[1], v);
if (t->val == v) return count(t->ch[0]);
return cnt(t->ch[0], v);
}
node *root;
public:
avl_tree() : root(nullptr) {}
int size() {
return count(root);
}
void insert(T val) {
root = insert(root, cnt(root, val), val);
}
void erase(int k) {
root = erase(root, k);
}
T select(int k) {
return find(root, k)->val;
}
int count(T val) {
return cnt(root, val);
}
};
int main()
{
ios::sync_with_stdio(false), cin.tie(0);
int Q, K;
cin >> Q >> K;
avl_tree<ll> tree;
while (Q--) {
int t;
cin >> t;
if (t == 1) {
ll v;
cin >> v;
tree.insert(v);
}
else if (tree.size() >= K) {
printf("%lld\n", tree.select(K - 1));
tree.erase(K - 1);
}
else {
printf("%d\n", -1);
}
}
return 0;
}
kazuma