Cod sursa(job #1577816)

Utilizator VicktorVictor Teodor Stoian Vicktor Data 23 ianuarie 2016 21:19:41
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>

using namespace std;

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

struct
{
    int val,poz;
} H[200005];
int nr,v[200005],n,cod;

void combinare(int i)
{
    int inf=H[i].val,p=H[i].poz;
    int fiu=2*i,tata=i;
    while(fiu<=nr)
    {
        if(fiu+1<=nr && H[fiu].val>H[fiu+1].val) fiu++;
        if(H[fiu].val<inf)
        {
            v[H[fiu].poz]=tata;
            H[tata]=H[fiu];
            tata=fiu;
            fiu=tata*2;
        }
        else
            break;
    }
    H[tata].val=inf;
    H[tata].poz=p;
    v[p]=tata;
}

void inserare(int inf)
{
    int tata,fiu;
    fiu=nr;
    tata=nr/2;
    while(inf<H[tata].val && tata>0)
    {
        v[H[tata].poz]=fiu;
        H[fiu]=H[tata];
        fiu=tata;
        tata=fiu/2;
    }
    H[fiu].val=inf;
    H[fiu].poz=nr;
    v[nr]=fiu;
}

int main()
{
    int inf;
    fin>>n;
    for(int i=1; i<=n; i++)
    {
        fin>>cod;
        if(cod<3)
        {
            fin>>inf;
            if(cod==1)
            {
                nr++;
                inserare(inf);
            }
            else
            {
                H[v[inf]]=H[nr--];
                combinare(v[inf]);
            }
        }
        else
            fout<<H[1].val<<'\n';

    }
    return 0;
}