Cod sursa(job #1979370)

Utilizator Chirita_MateiChirita Matei Chirita_Matei Data 10 mai 2017 13:30:16
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <iostream>
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] || v[parinte] == -1){
        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;

            if(x == 40)
            {
                cout << x;
            }

            add(lg);
        }

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

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

    return 0;
}