1. 程式人生 > 其它 >T237469 【深基16.例7】普通二叉樹(簡化版)

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;

}