Cod sursa(job #630046)

Utilizator gramatovici_paulGramatovici Paul gramatovici_paul Data 4 noiembrie 2011 16:24:51
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>

using namespace std;

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

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


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


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

void coboara(int p)
{
    int ps=p;
    if(p*2<=h[0] && h[p*2]<h[ps])
        ps=2*p;
    if(p*2+1<=h[0] && h[p*2+1]<h[ps])
        ps=2*p;
    if(ps!=p)
    {
        swap(h[p],h[ps]);
        swap(poz[h[p]],poz[h[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);
    swap(h[poz[x]],h[h[0]]);
    swap(poz[h[poz[x]]],poz[h[h[0]]]);
    --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;
}