AtCoder Beginner Contest 241(Sponsored by Panasonic)
利用STL中的multiset
multiset的头文件是#include<set>
multiset.erase(x)删除所有值为x的元素
multiset有二分成员函数 更快
找到第一个小于等于x的元素:.upper_bound(x)-1
找到第一个大于等于x的元素:.lower_bound(x)
记忆:lower更低 取等号 upper更高 不取等号
#include<iostream>
#include<algorithm>
#include<set>
typedef long long LL;
using namespace std;
multiset<LL>ms;
int main()
{
int n;cin >> n;
while (n--)
{
int opt;cin >> opt;
if (opt == 1)
{
LL x;cin >> x;
ms.insert(x);
}
if (opt == 2)
{
LL x, k;cin >> x >> k;
auto it = ms.upper_bound(x);// > -1 相当于 <=
while (it != ms.begin() && k > 0)it--, k--;
if (k > 0)cout << -1 << endl;
else cout << *it << endl;
}
if (opt == 3)
{
LL x, k;cin >> x >> k;
auto it = ms.lower_bound(x);
while (it != ms.end() && k > 1)it++, k--;
if (it == ms.end())cout << -1 << endl;
else cout << *it << endl;
}
}
return 0;
}