Cod sursa(job #1806036)

Utilizator triscacezarTrisca Vicol Cezar triscacezar Data 14 noiembrie 2016 19:29:12
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>

using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
void heap_up(int);
void heap_down(int);
void Swap(int,int);
int i,x,n,m,k,poz,c,val[200010],H[200010],P[200010];
int main()
{
    f>>n;
    for(;n;n--)
    {
        f>>c;
        if(c==3)
        {
            g<<val[H[1]]<<'\n';
            continue;
        }
        f>>x;
        if(c==1)
        {
            m++;
            val[++k]=x;
            H[m]=k;P[k]=m;
            heap_up(m);continue;
        }
        poz=P[x];
        H[poz]=H[m];
        P[H[poz]]=poz;
        m--;
        heap_up(poz);
        heap_down(poz);
    }
    return 0;
}
void heap_up(int fiu)
{
    int tata=fiu>>1;
    if(!tata)
        return;
    if(val[H[fiu]]<val[H[tata]])
    {
        Swap(tata,fiu);
        heap_up(tata);
    }
}
void heap_down(int tata)
{
    int fiu=tata*2;
    if(fiu>m)
        return;
    if(fiu<m&&val[H[fiu]]>val[H[fiu+1]])
        fiu++;
    if(val[H[fiu]]<val[H[tata]])
    {
        Swap(tata,fiu);
        heap_down(fiu);
    }
}
void Swap(int i,int j)
{
    int aux=H[i];
    H[i]=H[j];H[j]=aux;
    P[H[i]]=i;P[H[j]]=j;
}