Cod sursa(job #1536706)

Utilizator daneel95Holteiu Daniel-Ninel daneel95 Data 26 noiembrie 2015 15:56:23
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.25 kb
#include <fstream>

using namespace std;

ifstream in("heapuri.in");
ofstream out("heapuri.out");

int n,x,operatie,p=1;
int heap[200005],pozitie[200005],ordine[200005];

void sift(int heap[],int &inaltime,int k)
{
    int fiu,aux;
    do{
        fiu=0;
        if(2*k <= inaltime)
        {
            fiu=2*k;
            if(2*k+1 <= inaltime && heap[2*k+1]<heap[2*k]) fiu=2*k+1;
            if(heap[fiu] >= heap[k]) fiu=0;
        }
        if(fiu){
            pozitie[heap[fiu]]=k;
            pozitie[heap[k]]=fiu;
            aux=heap[k];
            heap[k]=heap[fiu];
            heap[fiu]=aux;
        }
    }while(fiu);
    return;
}

void fa_heap(int heap[],int &inaltime,int k)
{
    int cheie=heap[k];

    while((k>1) && (cheie<heap[k/2]))
    {
        heap[k]=heap[k/2];
        pozitie[heap[k/2]]=k;
        k=k/2;
    }
    pozitie[cheie]=k;
    heap[k]=cheie;
    return;
}

void inserare_heap(int heap[],int &inaltime,int x)
{
    inaltime++;
    heap[inaltime]=x;
    ordine[p]=x;
    p++;
    pozitie[x]=inaltime;
    fa_heap(heap,inaltime,inaltime);
    return;
}

void stergere_heap(int heap[],int &inaltime,int poz)
{
    //out<<"Elimin elementul "<<heap[poz]<<" Si initial il inlocuiesc cu: "<<heap[inaltime]<<"\n";
    heap[poz]=heap[inaltime];
    inaltime--;
    if(poz>1 && heap[poz]<heap[poz/2]) fa_heap(heap,inaltime,poz);
        else sift(heap,inaltime,poz);
    return;
}


int main()
{
    int i,inaltime,k=1,j;
    in>>n;
    inaltime=0;
    for(i=1;i<=n;i++)
    {
        in>>operatie;
        if(operatie==1)
        {
            in>>x;
            //out<<"Inserez elementul: "<<x<<"\n";
            inserare_heap(heap,inaltime,x);
        }
        if(operatie==2)
        {
            in>>x;
            stergere_heap(heap,inaltime,pozitie[ordine[x]]);
        }
        if(operatie==3)
        {
            out<<heap[1]<<"\n";
        }
        //out<<"Heap dupa operatia "<<i<<" este "<<"\n";
        //for(j=1;j<=inaltime;j++) out<<heap[j]<<" ";
        //out<<"\n";
        //out<<"Pozitiile lor sunt"<<"\n";
        //for(j=1;j<=inaltime;j++) out<<pozitie[heap[j]]<<" ";
        //out<<"\n";
    }
    in.close();
    out.close();
    return 0;
}