Cod sursa(job #892242)

Utilizator TodeaDariustodea darius TodeaDarius Data 25 februarie 2013 23:21:44
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<cstdio>
#include<iostream>
using namespace std;
int pozbag[200005],n,k,m,op,nodins,nract,nract2;
struct arbore
{
    int nr;
    int nod;
} v[200005];

void insereaza(int k)
{
    if(k/2>=1 && v[k/2].nod>v[k].nod)
    {
        swap(pozbag[v[k/2].nr],pozbag[v[k].nr]);
        swap(v[k/2],v[k]);
        insereaza(k/2);
    }
}

void stergere(int k)
{
    int min1,pozmin;
    pozbag[v[n].nr]=pozbag[v[k].nr];
    swap(v[n],v[k]);n--;
    while(2*k<=n)
    {
        min1=v[2*k].nod;
        pozmin=2*k;
        if(2*k+1<=n && min1>v[2*k+1].nod)
        {
            min1=v[2*k+1].nod;
            pozmin=2*k+1;
        }
        swap(pozbag[v[pozmin].nr],pozbag[v[k].nr]);
        swap(v[k],v[pozmin]);
        k=pozmin;
    }
}
int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);

    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&op);
        if(op==1)
        {
            scanf("%d",&nodins);
            pozbag[++nract]=++n;
            v[n].nod=nodins;
            v[n].nr=nract;
            insereaza(n);
        }
        if(op==2)
        {
            scanf("%d",&nract2);
            stergere(pozbag[nract2]);
        }
        if(op==3)
            printf("%d\n",v[1].nod);
    }
    return 0;
}