T237469 【深基16.例7】普通二叉樹(簡化版)
#include<cstdio>
#include<iostream>
#include<set>
using namespace std;
multiset<int>q;
int n,t,x,order;
int main(){
q.insert(-0x7fffffff);
q.insert(0x7fffffff); //提前放入這兩個數,避免錯誤
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&t,&x);
if(t==1)
{
auto it=q.lower_bound(x);
//auto是自動判斷資料型別
// it 取得 x 的位置
order=0; //order為排名
for(auto i=q.begin();i!=it;i++,order++);
//這裡就處理出了x的排名——order
printf("%d\n",order);
}
else if(t==2)
{
order=-1;
//初值為-1是因為前面有一個-0x7fffffff
for(int i:q)
if(++order==x)//縮寫,order先自增一,再判斷是否與x相等
printf("%d\n",i); //i就是容器裡的值,輸出i 查詢排名為 x的數
}
else if(t==3)
{
auto it=q.lower_bound(x); //取得第一個大於等於x的值,也就是第一個x的位置
printf("%d\n",*--it); //由於我們要取得前驅,所以it要自減一
}
else if(t==4)
{
printf("%d\n",*q.upper_bound(x)); //要取得後繼,就是第一個大於x的值
//用upper_bound方法取得第一個大於x的迭代器
}
else
{
q.insert(x); //直接插入一個數 xx
}
}
return 0;
}