Cod sursa(job #630001)

Utilizator theocmtAxenie Theodor theocmt Data 4 noiembrie 2011 15:10:24
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 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 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 <= 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(h[p],h[ps]);
        swap(poz[h[p]],poz[h[ps]]);
        coboara(ps);
    }
}

int main()
{
    int i,n,op,x;
    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)
        {
            scanf("%d",&x);
            v[++nr]=x;
            h[++nh]=nr;
            poz[nr]=nh;
            urca(nh);
        }
        if (op == 2)
        {
            scanf("%d",&x);
            h[poz[x]] = h[nh];
            poz[h[nh]] = x;
            nh--;
            urca(poz[x]);
            coboara(poz[x]);
        }
        if (op == 3)
        {
            printf("%d\n",v[h[1]]);
        }
    }
    return 0;
}