Cod sursa(job #1597415)

Utilizator coolyonutzepure ionut coolyonutz Data 11 februarie 2016 23:05:09
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <cstdio>
#include <algorithm>


using namespace std;

int n,i,cod,cnt,h[200001],ord[200001],poz[200001],k;

void up(int ind)
{
    if(ind>1 && h[ind]<h[ind/2])
    {
        swap(h[ind],h[ind/2]);
        swap(poz[h[ind]],poz[h[ind/2]]);

        up(ind/2);
    }
}

void down(int ind)
{
    if(ind*2<n)
    {
        if(h[ind*2]<h[ind*2+1] && h[ind]>h[ind*2])
        {
            swap(h[ind],h[ind*2]);
            swap(poz[h[ind]],poz[h[ind*2]]);
            down(ind*2);
        } else
        if(h[ind*2]>=h[ind*2+1] && h[ind]>h[ind*2+1])
        {
            swap(h[ind],h[ind*2+1]);
            swap(poz[h[ind]],poz[h[ind*2+1]]);
            down(ind*2+1);
        }
    }else
    if(ind*2==n && h[ind]>h[ind*2])
    {
         swap(h[ind],h[ind*2]);
         swap(poz[h[ind]],poz[h[ind*2]]);
    }
}

void adaugare(int x)
{
    n++;
    h[n]=x;
    poz[x]=n;
    up(n);
}

void stergere(int x)
{
    int ind=poz[x];
    swap(h[ind],h[n]);
    swap(poz[h[ind]],poz[h[n]]);
    n--;
    up(ind);
    down(ind);

}

int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);

    int x;

    scanf("%d",&k);

    for(i=1; i<=k; i++)
    {
        scanf("%d",&cod);

        if(cod==1)
        {
             scanf("%d",&x);
             cnt++;
             ord[cnt]=x;
             adaugare(x);
        }
        if(cod==2)
        {
             scanf("%d",&x);
             stergere(ord[x]);
        }
        if(cod==3) printf("%d\n",h[1]);
    }










}