Cod sursa(job #1022382)

Utilizator thewildnathNathan Wildenberg thewildnath Data 5 noiembrie 2013 12:36:50
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<stdio.h>

int v[200010],poz[200010],h[200010],n,nr;

inline void swap(int &a,int &b)
{
    int aux;
    aux=a;a=b;b=aux;
}

inline void push()
{
    int x,p;
    scanf("%d",&x);
    ++n;++nr;
    v[nr]=x;
    poz[nr]=nr;
    h[n]=nr;
    p=n;
    while(p/2 && v[p/2] > v[p])
    {
        swap(v[p],v[p/2]);
        swap(h[p],h[p/2]);

        poz[h[p]]=p;
        poz[h[p/2]]=p/2;
        p/=2;
    }
}

inline void pop()
{
    int x,p;
    scanf("%d",&x);

    swap(v[x],v[n]);
    swap(h[x],h[n]);

    --n;

    while(1)
    {
        p=2*x;
        if(p>n)
            break;
        if(v[p+1]<v[p] && (p+1)<=n)
            ++p;
        if(v[p]>v[x])
            break;

        swap(v[p],v[x]);
        swap(h[p],h[x]);

        poz[v[x]]=x;
        poz[v[p]]=p;
        x=p;
    }
}

int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    int m,i,op,x;
    scanf("%d",&m);

    while(m--)
    {
        scanf("%d",&op);
        switch(op)
        {
            case 1:{push();break;}
            case 2:{pop();break;}
            case 3:{printf("%d\n",v[1]);break;}
        }
    }

    return 0;
}