手写的堆

#include<bits/stdc++.h>
using namespace std;
int tot,dui[10000000],n,x,y;

inline void add(int i)
{
    tot++;
    dui[tot] = i;
    int k = tot;
    while(k>1 && dui[k] < dui[k>>1])
    {
        swap(dui[k] , dui[k>>1]);
        k >>= 1;
    }
}

inline void del()
{
    dui[1] = dui[tot--];
    int p = 1;
    bool k = 0;
    while(p * 2 <= tot)
    {
        if(p * 2 == tot) k = 0;
        else k = dui[p*2] > dui[p*2+1];
        if(dui[p] > dui[p * 2 + (int)k])
        {
            swap(dui[p] , dui[p * 2 + (int)k]);
            p = p * 2 + (int)k;
        }
        else break;
        
    }
}

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        if(x==1)
        {
            scanf("%d",&y);
            add(y);
        }
        if(x==2) printf("%d\n",dui[1]);
        if(x==3) del();
    }
}

 

posted @ 2017-10-13 16:12  cc123321  阅读(127)  评论(0编辑  收藏  举报