Cod sursa(job #1256091)

Utilizator edicCiuculescu Eduard edic Data 5 noiembrie 2014 19:58:46
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include<cstdio>
using namespace std;
int heap[200002],v[200002],poz[200002],n,k;
int fiudr(int a)
{
    return (a*2)+2;
}
int fiust(int a)
{
    return (a*2)+1;
}
int tata(int a)
{
    return (a-1)/2;
}
void schimb(int p1,int p2)
{
    int aux;
    poz[heap[p1]]=p2;
    poz[heap[p2]]=p1;
    aux=heap[p1];
    heap[p1]=heap[p2];
    heap[p2]=aux;
}
void urcare(int p)
{
    while((p!=0)&&(v[heap[p]]<v[heap[tata(p)]]))
    {
        schimb(p,tata(p));
        p=tata(p);
    }
}
void coborare(int p)
{
    int f,q;
    f=1;
    while((f==1)&&(fiust(p)<n))
        {
        q=fiust(p);
        if((fiudr(p)<n)&&(v[heap[fiudr(p)]]<v[heap[q]]))
        {
            q=fiudr(p);
        }
        if(v[heap[q]]<v[heap[p]])
        {
            schimb(p,q);
            p=q;
        }
        else
        {
            f=0;
        }
    }
}
void sterge()
{
    int p;
    scanf("%d",&p);
    p--;
    n--;
    heap[poz[p]]=heap[n];
    poz[heap[n]]=poz[p];
    if((poz[p]!=0)&&(v[heap[poz[p]]]<v[heap[tata(poz[p])]]))
    {
        urcare(poz[p]);
    }
    else
    {
        coborare(poz[p]);
    }
}
void adauga()
{
    scanf("%d",&v[k]);
    heap[n]=k;
    poz[k]=n;
    k++;
    n++;
    urcare(poz[k]);
}
void minim()
{
    printf("%d\n",v[heap[0]]);
}
void pre(int c)
{
    if(c==1)
    {
        adauga();
    }
    else
        if(c==2)
        {
            sterge();
        }
        else
            minim();
}
int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    int i,c,nr;
    scanf("%d",&nr);
    for(i=1;i<=nr;i++)
    {
        scanf("%d",&c);
        pre(c);
    }
    return 0;
}