Cod sursa(job #2289852)

Utilizator Alex_BubBuburuzan Alexandru Alex_Bub Data 25 noiembrie 2018 13:55:16
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 200000, oo = 10000000;

struct Nod{int val; int cod;} Heap[NMAX + 5];

int Poz[NMAX + 5], T, K, ct;///pozitia in heap a nodului i este Poz[i]

///implementare operatii heap

void AddNod(Nod N)
{
    Heap[++K] = N, Poz[N.cod] = K;

    int i = K;
    ///urcare
    while(i > 1 && Heap[i].val < Heap[i / 2].val) {
        swap(Heap[i], Heap[i / 2]);
        swap(Poz[Heap[i].cod], Poz[Heap[i / 2].cod]);

        i /= 2;
    }
}

void DeleteNod(int nume)
{
    int i = Poz[nume];

    Heap[i] = Heap[K], Poz[Heap[i].cod] = Poz[Heap[K--].cod];
    Heap[K + 1] = {oo, 0}, Heap[K + 2] = {oo, 0};

    ///cobor
    while(Heap[i].val > Heap[2 * i].val || Heap[i].val > Heap[2 * i + 1].val) {
        int nextpoz;

        if(Heap[2 * i].val < Heap[2 * i + 1].val)
            nextpoz = 2 * i;
        else
            nextpoz = 2 * i + 1;

        swap(Heap[nextpoz], Heap[i]);
        swap(Poz[Heap[nextpoz].cod], Poz[Heap[i].cod]);

        i = nextpoz;
        if(2 * i > K) break;
    }
}

int main()
{
    fin >> T;

    while(T--) {
        int op, x;

        fin >> op;

        if(op == 3)
            fout << Heap[1].val << '\n';

        if(op == 2) {
            fin >> x;
            DeleteNod(x);
        }

        if(op == 1) {
            fin >> x;
            AddNod({x, ++ct});
        }
    }

    fin.close();
    fout.close();

    return 0;
}