Cod sursa(job #1807810)

Utilizator savulescustefanSavulescu Stefan savulescustefan Data 16 noiembrie 2016 22:26:47
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <cstdio>

using namespace std;
int H[200004],poz[200004],poz1[200004],aux,i,x,k,st,dr,n,cod,nr;
void HeapUp (int x)
{
    if (x>1)
    {
        if (H[x]<H[x/2])
        {
            aux=H[x];
            H[x]=H[x/2];
            H[x/2]=aux;
            aux=poz1[x];
            poz1[x]=poz1[x/2];
            poz1[x/2]=aux;
            aux=poz[poz1[x]];
            poz[poz1[x]]=poz[poz1[x/2]];
            poz[poz1[x/2]]=aux;
            HeapUp(x/2);
        }
    }
}
void HeapDown (int x)
{
    int i,aux;
    if (2*x<=k)
    {
        st=H[2*x];
        if (2*x<k)
            dr=H[2*x+1];
        else
            dr=st+1;
        if (dr<st)
            i=2*x+1;
        else
            i=2*x;
        if (H[i]<H[x])
        {
            aux=H[x];
            H[x]=H[i];
            H[i]=aux;
            aux=poz1[x];
            poz1[x]=poz1[i];
            poz1[i]=aux;
            aux=poz[poz1[x]];
            poz[poz1[x]]=poz[poz1[i]];
            poz[poz1[i]]=aux;
            HeapDown(i);
        }
    }
}
int main()
{
    freopen ("heapuri.in","r",stdin);
    freopen ("heapuri.out","w",stdout);
    scanf ("%d", &n);
    for (i=1;i<=n;i++)
    {
        scanf ("%d", &cod);
        if (cod==1)
        {
            scanf ("%d", &x);
            k++;
            poz[++nr]=k;
            poz1[k]=nr;
            H[k]=x;
            HeapUp(k);
        }
        else if (cod==2)
        {
            scanf ("%d", &x);
            H[poz[x]]=H[k];
            poz1[poz[x]]=poz1[k];
            poz[poz1[k]]=poz[x];
            k--;
            HeapDown(poz[x]);
        }
        else
            printf ("%d\n", H[1]);
    }
    return 0;
}