結果
| 問題 | No.649 ここでちょっとQK! |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-06-21 16:58:46 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 285 ms / 3,000 ms |
| コード長 | 2,105 bytes |
| コンパイル時間 | 1,947 ms |
| コンパイル使用メモリ | 177,444 KB |
| 実行使用メモリ | 8,732 KB |
| 最終ジャッジ日時 | 2024-12-25 17:47:05 |
| 合計ジャッジ時間 | 7,873 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 32 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define rep(i,j,n) for(int i=j;i<n;++i)
#define all(i) i.begin(),i.end()
#define rall(i) i.rbegin(), i.rend()
#define INF 1e9
#define LINF 1e18
const int mod = 1e9 + 7;
typedef long long i64;
typedef pair<int, int> pi;
template <class T> using vt = vector<T>;
template <class T> using vvt = vector<vector<T>>;
i64 gcd(i64 n, i64 m) {return (m == 0? n : gcd(m, n % m));}
i64 lcd(i64 n, i64 m) {return (n / gcd(n, m) * m);}
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
template <class T> class BinaryIndexedTree {
private:
int n;
std::vector<T> bit;
public:
BinaryIndexedTree(int node) : n(node), bit(node + 1, 0) {}
inline T sum(int i) {
++i;
T s = 0;
while(i > 0) {
s += bit[i];
i -= i & -i;
}
return s;
}
inline T sum(int a, int b) {
return sum(b) - sum(a - 1);
}
inline void add(int i, T x) {
++i;
while(i <= n) {
bit[i] += x;
i += i & -i;
}
}
int get(long long k) {
++k;
int res = 0, N = 1;
while(N < bit.size()) N *= 2;
for(int i = N / 2; i > 0; i /= 2) {
if(res + i < bit.size() && bit[res + i] < k) {
k -= bit[res + i];
res += i;
}
}
return res + 1;
}
};
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
int q, k;
cin >> q >> k;
vt<pair<int, i64>> query(q);
vt<i64> vec;
rep(i, 0, q) {
int c;
i64 v;
cin >> c;
if(c == 1) {
cin >> v;
vec.push_back(v);
}
else v = 0;
query[i] = {c, v};
}
sort(all(vec));
vec.erase(unique(all(vec)), vec.end());
BinaryIndexedTree<int> bit(vec.size());
rep(i, 0, q) {
auto p = query[i];
if(p.first == 1) {
int idx = lower_bound(all(vec), p.second) - vec.begin();
bit.add(idx, 1);
}
else {
if(bit.sum(vec.size() - 1) < k) {
cout << -1 << endl;
}
else {
int res = bit.get(k - 1);
cout << vec[res - 1] << endl;
bit.add(res - 1, -1);
}
}
}
}