Cod sursa(job #638676)

Utilizator gramatovici_paulGramatovici Paul gramatovici_paul Data 21 noiembrie 2011 13:02:40
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <cstdio>

using namespace std;

int h[200001],v[200001],poz[200001];

inline void swap(int a,int b)
{
    int c;
    c=h[a];
    h[a]=h[b];
    h[b]=c;
    poz[h[a]]=a;
    poz[h[b]]=b;
}


void arata()
{
    printf("%d\n",v[h[1]]);
    return;
}


void urca (int p)
{
    while(p!=1  && v[h[p]]<v[h[p/2]])
    {
        swap(p,p/2);
        p=p/2;
    }
}

void coboara(int p)
{
    int ps=p;
    if(p*2<=h[0] && v[h[p*2]]<v[h[ps]])
        ps=2*p;
    if(p*2+1<=h[0] && v[h[p*2+1]]<v[h[ps]])
        ps=2*p+1;
    if(ps!=p)
    {
        swap(p,ps);
        coboara(ps);
    }
}


void baga()
{
    scanf("%d",&v[++v[0]]);
    h[++h[0]]=v[0];
    poz[v[0]]=h[0];
    urca(h[0]);
}

void scoate()
{
    int x;
    scanf("%d",&x);
    //h[poz[x]]=h[h[0]];
    swap(poz[x],h[0]--);
    urca(poz[x]);
    coboara(poz[x]);
}



int main()
{
    int i,n,op;
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;++i)
    {
        scanf("%d",&op);
        if(op==1)
            baga();
        if(op==2)
            scoate();
        if(op==3)
            arata();

    }
    return 0;
}