Cod sursa(job #1536713)

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

using namespace std;

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

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

void sift(long long heap[],long long &inaltime,long long k)
{
    long long 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(long long heap[],long long &inaltime,long long k)
{
    long long 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(long long heap[],long long &inaltime,long long x)
{
    inaltime++;
    heap[inaltime]=x;
    ordine[p]=x;
    p++;
    pozitie[x]=inaltime;
    fa_heap(heap,inaltime,inaltime);
    return;
}

void stergere_heap(long long heap[],long long &inaltime,long long poz)
{
    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()
{
    long long i,inaltime,k=1,j;
    in>>n;
    inaltime=0;
    for(i=1;i<=n;i++)
    {
        in>>operatie;
        if(operatie==1)
        {
            in>>x;
            inserare_heap(heap,inaltime,x);
        }
        if(operatie==2)
        {
            in>>x;
            if(inaltime>0) stergere_heap(heap,inaltime,pozitie[ordine[x]]);
        }
        if(operatie==3)
        {
            out<<heap[1]<<"\n";
        }
    }
    in.close();
    out.close();
    return 0;
}