Cod sursa(job #630058)

Utilizator stinkyStinky si Grasa stinky Data 4 noiembrie 2011 17:06:49
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <cstdio>

using namespace std;

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

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 scrie_h()
{
    for(int i=1 ; i<=nh ; i++)
        printf("h[%d]=%d,v[%d]=%d\t",i,h[i],h[i],v[h[i]]);
    printf("\n");
}

void scrie_poz()
{
    for(int i=1 ; i<=nr ; i++)
        printf("poz[%d] = %d ",i,poz[i]);
    printf("\n");
}
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 <= nh) && (v[h[2*p]] < v[h[ps]]))
        ps = 2*p;
    if ((p*2+1 <= nh) && (v[h[2*p+1]] < v[h[ps]]))
        ps = 2*p+1;
    if (ps != p)
    {
        swap(p,ps);
        coboara(ps);
    }
}

int main()
{
    int i,n,op,x,ord;
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&n);
    for (i=1; i<=n; i++)
    {
        scanf("%d",&op);
        //printf("nh = %d\t",nh);
        if (op == 1)
        {
            scanf("%d",&x);
            v[++nr]=x;
            h[++nh]=nr;
            poz[nr]=nh;
            urca(nh);
            //printf("am adaugat %d:\n",x);
            //scrie_h();
            //scrie_poz();
        }
        if (op == 2)
        {
            scanf("%d",&ord);
            if(ord == 29)
            {
                //printf("\n");
            }
            //printf("voi scoate al %d - lea elem = %d, aflat in h pe poz %d:\n",ord,v[ord],poz[ord]);
            h[poz[ord]] = h[nh];
            poz[h[poz[ord]]] = ord;
            swap(poz[ord],nh--);
            //nh--;
            urca(poz[ord]);
            coboara(poz[ord]);
            //scrie_h();
            //scrie_poz();
        }
        if (op == 3)
        {
            printf("%d\n",v[h[1]]);
        }
    }
    return 0;
}