Mai intai trebuie sa te autentifici.

Cod sursa(job #1160818)

Utilizator tudgal1001Profir Tudor tudgal1001 Data 30 martie 2014 20:24:19
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<cstdio>
#define NMax 200005
using namespace std;

int H[NMax],Pos[NMax],V[NMax];
int HDim,Nr;

void push (int crt)
{
    int aux;
    while (crt/2 && V[H[crt]]<V[H[crt/2]])
    {
        aux=H[crt];
        H[crt]=H[crt/2];
        H[crt/2]=aux;
        Pos[H[crt]]=crt;
        Pos[H[crt/2]]=crt/2;
        crt/=2;
    }
}

void pop (int crt)
{
    int aux,mini=0;
    while (mini!=crt)
    {
        mini=crt;
        if (2*mini<=HDim && V[H[2*mini]]<V[H[crt]])
            crt=2*mini;
        if (2*mini+1<=HDim && V[H[2*mini+1]]<V[H[crt]])
            crt=2*mini+1;
        aux=H[mini];
        H[mini]=H[crt];
        H[crt]=aux;
        Pos[H[mini]]=mini;
        Pos[H[crt]]=crt;
    }
}

int main ()
{
    int N,tip,i,x;
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&N);
    for (i=1; i<=N; i++)
    {
        scanf("%d",&tip);
        if (tip==1)
        {
            scanf("%d",&x);
            HDim++, Nr++;
            V[Nr]=x;
            H[HDim]=Nr;
            Pos[Nr]=HDim;
            push(HDim);
        }
        else if (tip==2)
        {
            scanf("%d",&x);
            V[x]=-1;
            push(Pos[x]);
            Pos[x]=0;
            H[1]=H[HDim--];
            Pos[H[1]]=1;
            if (HDim>1) pop(1);
        }
        else printf("%d\n",V[H[1]]);
    }
    return 0;
}