Cod sursa(job #1577155)

Utilizator Daniel.CreangaDaniel Creanga Daniel.Creanga Data 23 ianuarie 2016 11:49:20
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#define NMAX 200001
using namespace std;
ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");
int n,nr;
int poz[NMAX];
//poz[i]=pozitia in h a elementului intrat al i-lea in ordinea cronologica
struct heap
{
    int inf;
    int ord;
}h[NMAX];
void inserare(int in)
{
    int f,t;
    f=++n;
    t=f/2;
    while(t>0 && h[t].inf>in)
    {
        poz[h[t].ord]=f;
        h[f]=h[t];
        f=t;
        t=t/2;
    }
    h[f].inf=in;
    h[f].ord=n;
    poz[h[f].ord]=f;
}
void combinare(int i)
{
    int in=h[i].inf,t=i,f=2*i;
    while (f<=n)
    {
        if (f+1<=n && h[f].inf>h[f+1].inf)
            f++;
        if (h[f].inf<in)
        {
            h[t]=h[f];
            t=f;
            f=2*t;
            poz[t]=poz[f];
        }
    else break;
    }
    h[t].inf=in;
}
void extragere(int i)
{
    heap x=h[poz[i]];
    h[poz[i]]=h[n--];
    combinare(poz[i]);
}
int main()
{
    int k,x;
    fin>>nr;
    for (int i=0;i<nr;i++)
    {
        fin>>k;
        if (k<3)
            fin>>x;
        if (k==1)
            inserare(x);
        else if (k==2)
            extragere(x);
        else fout<<h[1].inf<<'\n';
    }
    return 0;
}