#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef multiset<int>::iterator sett;//重新定义一下迭代器
sett c,d;//定义两个迭代器
signed main()
{
int n,a,x;
multiset<int> s1;
cin>>n;
s1.insert(2147483647);
//s1.insert(-2147483647);
while(n--)
{
cin>>a>>x;
switch(a){
case 1:{//查询x的排名
c=s1.lower_bound(x);//二分查找x第一次出现的位置的迭代器
int num=1;
for(d=s1.begin();d!=c;d++)
{
num++;
}
cout<<num<<endl;
break;
}
case 2:{//查询排名为x的数
int num=1;
for(d=s1.begin();num<x;num++)
{
d++;
}
cout<<*d<<endl;
break;
}
case 3:{//查找前驱
c=s1.lower_bound(x);//x第一次出现的位置迭代器
if(c==s1.begin())
{
cout<<-2147483647<<endl;
}
else
{
c--;
cout<<*c<<endl;
}
break;
}
case 4:{
c=s1.upper_bound(x);//第一个大于x的数的位置迭代器
cout<<*c<<endl;
break;
}
case 5:{
s1.insert(x);//插入新元素
break;
}
}
}
return 0;
}
P5076 【深基16.例7】普通二叉树(简化版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
multiset可以不去重,并且自动从小到大排序,insert输入,访问用迭代器
multiset<int>::iterator迭代器
lower_bound找第一个大于等于x的数,便于找第一个x,往前一个就是前驱
upper_bound找第一个大于的数,就是后继
注意返回的都是迭代器,*d是迭代器所指的值