Cod sursa(job #1164360)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 2 aprilie 2014 00:05:34
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.54 kb
#include<fstream>
using namespace std;

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

int n,a[200005],lungime,ordine[200005],ordinelung,pozitii[200005];

inline void Insereaza(int x)
{
    int cacat,aux,tos;
    a[++lungime]=x;
    ordine[++ordinelung]=lungime;
    cacat=lungime/2;aux=lungime;
    pozitii[lungime]=ordinelung;
    while (cacat && a[cacat]>x)
        {
            a[aux]=a[cacat];
            a[cacat]=x;
            tos=ordine[ordinelung];
            ordine[ordinelung]=cacat;
            ordine[pozitii[cacat]]=tos;
            pozitii[tos]=pozitii[cacat];
            pozitii[cacat]=ordinelung;
            aux>>=1;
            cacat>>=1;
        }
}

inline void Sterge(int x)
{
    int fiu,tata,aux,gata=0,tos;
    pozitii[ordine[x]]=pozitii[lungime];
    ordine[pozitii[lungime]]=ordine[x];
    a[ordine[x]]=a[lungime];
    lungime--;
    fiu=ordine[x]*2;
    tata=ordine[x];
    while (fiu<=lungime && gata==0)
        {
            if (fiu+1<=lungime && a[fiu+1]<a[fiu])
                fiu++;
            if (a[fiu]<a[tata])
                {
                    aux=a[tata];
                    a[tata]=a[fiu];
                    a[fiu]=aux;
                    tos=pozitii[tata];
                    pozitii[tata]=pozitii[fiu];
                    pozitii[fiu]=tos;
                    ordine[pozitii[tata]]=tata;
                    ordine[pozitii[fiu]]=fiu;
                    tata=fiu;
                    fiu=tata*2;
                }
            else gata=1;
        }
    gata=0;
    tata=ordine[x]/2;
    fiu=ordine[x];
    while (tata>=1 && gata==0)
        {
            if (a[fiu]<a[tata])
                {
                    aux=a[tata];
                    a[tata]=a[fiu];
                    a[fiu]=aux;
                    tos=pozitii[tata];
                    pozitii[tata]=pozitii[fiu];
                    pozitii[fiu]=tos;
                    ordine[pozitii[tata]]=tata;
                    ordine[pozitii[fiu]]=fiu;
                    fiu=tata;
                    tata=fiu/2;
                }
            else gata=1;
        }
}

int main()
{
    int i,op,x;
    fin>>n;
    for (i=1;i<=n;i++)
        {
            fin>>op;
            if (op==1)
               {
                   fin>>x;
                   Insereaza(x);
               }
            else if (op==2)
                {
                    fin>>x;
                    Sterge(x);
                }
            else fout<<a[1]<<"\n";
        }
    return 0;
}