結果
| 問題 |
No.649 ここでちょっとQK!
|
| コンテスト | |
| ユーザー |
oxyshower
|
| 提出日時 | 2019-06-01 13:17:04 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 371 ms / 3,000 ms |
| コード長 | 1,813 bytes |
| コンパイル時間 | 1,929 ms |
| コンパイル使用メモリ | 175,088 KB |
| 実行使用メモリ | 23,584 KB |
| 最終ジャッジ日時 | 2024-09-17 19:54:47 |
| 合計ジャッジ時間 | 8,834 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 32 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
#define int long long
#ifdef LOCAL_DEBUG
#include "LOCAL_DEBUG.hpp"
#endif
template <class T>
struct BIT{
int n;
vector<T> bit; //[1,N]
BIT(int _n){
n = _n + 1;
bit.resize(n,0);
}
T sum(int i){
T sum = 0;
while(i > 0){
sum += bit[i];
i -= i & -i;
}
return sum;
}
void add(int i,T x){
while(i < n){
bit[i] += x;
i += i & -i;
}
}
// 合計がw以上の最小の位置 O(log^2 n)
int lower_bound(T x) {
int left = -1, right = n;
while(right - left > 1) {
int mid = (left + right)/2;
if(sum(mid) >= x) right = mid;
else left = mid;
}
return right;
}
/*
// a[0]+...+a[ret] >= x
int lower_bound(T x){
int ret = -1;
int k = 1;
while(2*k < n) k <<= 1;
while(k > 0){
if(ret+k < n && bit[ret+k] < x){
x -= bit[ret+k];
ret += k;
}
k >>= 1;
}
return ret+1;
}
*/
};
template<class T>
vector<T> compress(vector<T> v){
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
return v;
}
signed main(){
int q,k; cin >> q >> k;
vector<int> query(q),v(q),vs;
for(int i = 0; i < q; i++){
cin >> query[i];
if(query[i] == 1) cin >> v[i],vs.push_back(v[i]);
}
vs = compress(vs);
map<int,int> mp;
for(int i = 0; i < vs.size(); i++){
mp[vs[i]] = i+1;
}
BIT<int> bitval(vs.size());
BIT<int> bitnum(vs.size());
for(int i = 0; i < q; i++){
if(query[i] == 1){
bitval.add(mp[v[i]],v[i]);
bitnum.add(mp[v[i]],1);
}
else {
if(bitnum.sum(vs.size()) < k) cout << -1 << endl;
else {
int idx = bitnum.lower_bound(k);
cout << vs[idx-1] << endl;
bitnum.add(idx,-1);
}
}
}
return 0;
}
oxyshower