Cod sursa(job #630049)

Utilizator theocmtAxenie Theodor theocmt Data 4 noiembrie 2011 16:26:13
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 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=a;
    a=b;
    b=c;
}

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 urca(int p)
{
    while ((p != 1) && (v[h[p]] < v[h[p/2]]))
    {
        poz[h[p]] = p/2;
        poz[h[p/2]] = p;
        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 <= 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)
    {
        poz[h[p]] = ps;
        poz[h[ps]] = p;
        swap(h[p],h[ps]);
        //swap(poz[h[p]],poz[h[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();
        }
        if (op == 2)
        {
            scanf("%d",&ord);
            h[poz[ord]] = h[nh];
            poz[h[poz[ord]]] = ord;
            nh--;
            urca(poz[ord]);
            coboara(poz[ord]);
            printf("am scos al %d - lea elem = %d, aflat in h pe poz %d:\n",ord,v[ord],poz[ord]);
            scrie_h();
        }
        if (op == 3)
        {
            printf("%d\n",v[h[1]]);
        }
    }
    return 0;
}