Cod sursa(job #581912)

Utilizator GaborGabrielFMI - GabrielG GaborGabriel Data 14 aprilie 2011 18:45:19
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream.h>
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int n,tip,i,x,Heap[200001],vf=0,j,poz[200001],cand[200001],aux,c,q;

void swap(int a, int b)
{
	int aux;
    aux=Heap[a];
    Heap[a]=Heap[b];
    Heap[b]=aux;    
    aux=poz[cand[a]];
    poz[cand[a]]=poz[cand[b]];
    poz[cand[b]]=aux;
    aux=cand[a];
    cand[a]=cand[b];
    cand[b]=aux;
}

void percolate(int k)
{
    int key = Heap[k];
    while(k>1 && key < Heap[k/2])
    {
        swap(k,k/2);
        k/=2;
    }
}

void sift(int k)
{
    int son;
    do{
        son=0;
        if(k+k<=vf)
        {
            son=k+k;
            if(son<vf && Heap[son+1]<Heap[son])
                ++son;
            if(Heap[son]>Heap[vf])
                son=0;
        }
        if(son)
        {
            swap(k,son);
            k=son;
        }
    }while(son);
}

void sterge(int k)
{
    swap(k,vf);    
    vf--;
    if(Heap[k]<Heap[k/2])
        percolate(k);
    else
        sift(k);    
}

int main()
{
    f>>n;
    for(i=1;i<=n;i++)
    {
        f>>tip;
        if(tip==3)
            g<<Heap[1]<<'\n';
        else
        {
            f>>x;
            if(tip==1)
            {                
                Heap[++vf]=x;
                poz[++c]=vf;
                cand[vf]=c;
                percolate(vf);
            }
            else
                sterge(poz[x]);
        }
    }    
    f.close();
    g.close();
    return 0;
}