Cod sursa(job #1162692)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 31 martie 2014 22:08:52
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#define Nmax 200005

using namespace std;

int H[Nmax],t[Nmax],poz[Nmax];

inline void Swap(int i, int j)
{
    int ti=t[i],tj=t[j],pozi=poz[i],pozj=poz[j],hi=H[i],hj=H[j];
    H[i]=hj; H[j]=hi;
    t[i]=tj; t[j]=ti;
    poz[tj]=i; poz[ti]=j;
}

inline void UpHeap(int k)
{
    int tata=k/2;
    while(k>1 && H[tata]>H[k])
    {
        Swap(tata,k);
        k=tata; tata=k/2;
    }
}

inline void DownHeap(int k)
{
    int fiu=2*k,gata=0;
    while(k<=H[0]/2 && !gata)
    {
        if(fiu+1<=H[0] && H[fiu+1]<H[fiu])
            ++fiu;
        if(H[k]<=H[fiu])
            gata=1;
        else
        {
            Swap(k,fiu);
            k=fiu; fiu=2*k;
        }
    }
}

int main()
{
    int M,i,x,tip,cnt=0;
    freopen ("heapuri.in","r",stdin);
    freopen ("heapuri.out","w",stdout);
    scanf("%d", &M);
    for(i=1;i<=M;++i)
    {
        scanf("%d", &tip);
        if(tip==1)
        {
            scanf("%d", &x);
            H[++H[0]]=x;
            t[H[0]]=++cnt; poz[cnt]=H[0];
            UpHeap(H[0]);
        }
        else
            if(tip==2)
            {
                scanf("%d", &x);
                H[poz[x]]=H[H[0]--];
                UpHeap(poz[x]);
                DownHeap(poz[x]);
            }
            else
                printf("%d\n", H[1]);
    }
    return 0;
}