Cod sursa(job #1335786)

Utilizator nicol.bolasNicol Bolas nicol.bolas Data 5 februarie 2015 21:26:53
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<fstream>
using namespace std;
#define NMAX 200005
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n,k,t,x,dh,a[NMAX],H[NMAX],P[NMAX];
void adaugare(int nr)
{
    int tata,nod,aux;
    H[++dh]=nr, P[H[dh]]=dh;
    nod=dh, tata=nod>>1;
    while (tata)
    {
        if (a[H[tata]]<=a[H[nod]])
            break;
        aux=H[nod], H[nod]=H[tata], H[tata]=aux;
        P[H[nod]]=nod, P[H[tata]]=tata;
        nod=tata, tata=nod>>1;
    }
}
void eliminare(int nr)
{
    int nod,fiu,aux;
    H[nr]=H[dh--], P[H[nr]]=nr;
    nod=nr, fiu=nod<<1;
    while (fiu<=dh)
    {
        if (fiu<dh && a[H[fiu]]>a[H[fiu+1]])
            ++fiu;
        if (a[H[nod]]<=a[H[fiu]])
            break;
        aux=H[nod], H[nod]=H[fiu], H[fiu]=aux;
        P[H[nod]]=nod, P[H[fiu]]=fiu;
        nod=fiu, fiu=nod<<1;
    }
}
int main()
{
    int i;
    fin>>n;
    for (i=1;i<=n;++i)
    {
        fin>>t;
        if (t==1)
        {
            fin>>x;
            a[++k]=x;
            adaugare(k);
        }
        else
        {
            if (t==2)
            {
                fin>>x;
                eliminare(P[x]);
            }
            else
                fout<<a[H[1]]<<"\n";
        }
    }
    return 0;
}