Cod sursa(job #1979339)

Utilizator Chirita_MateiChirita Matei Chirita_Matei Data 10 mai 2017 12:18:10
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>

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

int v[800010],a[200010],pos[200010],o,x,lg,n;

void add(int nod)
{
    int parinte = nod/2;

    if(v[parinte] > v[nod]){
        swap(pos[a[parinte]],pos[a[nod]]);
        swap(a[parinte], a[nod]);
        swap(v[parinte], v[nod]);
        add(parinte);
    }
}

void del(int nod)
{
    int copil1 = nod*2;
    int copil2 = nod*2 + 1;

    if(v[copil1] > v[copil2] && copil2 <= lg && v[copil2] != -1){
        swap(pos[a[nod]],pos[a[copil2]]);
        swap(a[nod], a[copil2]);
        swap(v[copil2], v[nod]);
        del(copil2);
    }

    else if(copil1 <= lg && v[copil1] != -1){
        swap(pos[a[nod]],pos[a[copil1]]);
        swap(a[nod], a[copil1]);
        swap(v[copil1], v[nod]);
        del(copil1);
    }

    else{
        v[nod] = -1;
        pos[a[nod]]=-1;
        a[nod]=-1;
    }
}

int main()
{
    fin >> n;

    for(int i = 1; i <= n; i++){
        fin >> o;

        if(o == 1){
            fin >> x;
            v[++lg] = x;
            a[lg] = lg;
            pos[lg] = lg;
            add(lg);
        }

        else if(o == 2){
            fin >> x;
            del(pos[x]);
        }

        else if(o == 3){
            fout << v[1] << '\n';
        }
    }

    return 0;
}