Cod sursa(job #2071436)

Utilizator alexilasiAlex Ilasi alexilasi Data 20 noiembrie 2017 18:02:33
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>
#define nMax 200010
using namespace std;

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

int n,i,x,m;

int a[nMax],h[nMax],v[nMax];

void up (int p)
{
    if(p>1&&a[h[p/2]]>a[h[p]])
    {
        swap(v[h[p]],v[h[p/2]]);
        swap(h[p/2],h[p]);
        up(p/2);
    }
}

void down(int p)
{
    if(p*2<m&&(a[h[p*2]]<a[h[p]]||a[h[p*2+1]]<a[h[p]]))
    {
        if(a[h[p*2+1]]<a[h[p*2]])
        {
            swap(v[h[p]],v[h[p*2+1]]);
            swap(h[p],h[p*2+1]);
            down(p*2+1);
        }
        else
        {
            swap(v[h[p]],v[h[p*2]]);
            swap(h[p],h[p*2]);
            down(p*2);
        }
    }
    else if(p*2==m&&a[h[p]]>a[h[p*2]])
    {
        swap(v[h[p]],v[h[p*2]]);
        swap(h[p],h[p*2]);
    }
}

void insereaza (int x)
{
    h[m]=x;
    v[m]=x;
    up(m);
}

void sterge (int x)
{
    swap(v[h[m]],v[h[x]]);
    swap(h[m],h[x]);
    m--;
    up(x);
    down(x);
}

int main()
{
    fin>>n;
    for(i=1;i<=n;i++)
    {
        fin>>x;
        if(x==1)
        {
            fin>>a[++m];
            insereaza(m);
        }
        else if(x==2)
        {
            fin>>x;
            sterge(v[x]);
        }
        else if(x==3)
        {
            fout<<a[h[1]]<<'\n';
        }
    }
    return 0;
}