Cod sursa(job #2716087)

Utilizator Casian_doispeChiriac Casian Casian_doispe Data 4 martie 2021 18:21:42
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.87 kb
#include <fstream>
#include <queue>

using namespace std;

ifstream cin ("heapuri.in") ;
ofstream cout ("heapuri.out") ;

/// este un arbore in care orice nod are informatia mai mica/ mai mare decat ambii copii
/// deci heap[f] < heap[2 * f] si heap[f] < heap[2 * f + 1]
/// cand se adauga un elem nou acesta se pune pe prima poz disponibila
/// daca nu urmeaza conditia heapului atunci se parcurge creanga curenta si se da swap intre nodul curent si tatal sau
/*
int heap[1009], poz[1009], poz_reciproc[1009], v[1009] ;

/// poz[x] este in numar intre 1 si n si este poz in vectorul initial a elementului care este in poz x in heap
/// poz_reciproc[x] este pozitia in heap pe care o are elementul cu indicele x in n

void update_heap(int indice_nod_curent, int x, int f) /// indice_... este indicele in heap, f este indicele in vectorul v
{

    /// nod curent zice pozitia in poz a nodului curent

    /// daca nodula curent nu exista macar in

    if(x < heap[indice_nod_curent]) /// x va da overtake la acest nod
    {

        if(heap[2 * indice_nod_curent] < heap[2 * indice_nod_curent + 1] || !poz[2 * indice_nod_curent + 1]) /// verificam as fie macar in heap acest nod
        {
            /// merge pe stanga

            update_heap(2 * indice_nod_curent, heap[indice_nod_curent], poz[2 * indice_nod_curent])

            heap[indice_nod_curent] = x ;
            poz_reciproc[f] = indice_nod_curent ;

            return ;
        }
        else
        {
            /// merge pe dreapta

            update_heap(2 * indice_nod_curent + 1, heap[indice_nod_curent], poz[2 * indice_nod_curent + 1])

            heap[indice_nod_curent] = x ;
            poz_reciproc[f] = indice_nod_curent ;

            return ;
        }

    }
    else /// x se va duce in jos pe o ramura, pe ramura cu elementul mai mare
    {

        if(heap[2 * indice_nod_curent] > heap[2 * indice_nod_curent + 1] || !poz[2 * indice_nod_curent + 1])/// verificam as fie macar in heap acest nod
        {
            /// merge pe stanga

            update_heap(2 * indice_nod_curent, x, f) ;

            return ;
        }
        else
        {
            /// merge pe dreapta

            update_heap(2 * indice_nod_curent + 1, x, f) ;

            return ;
        }

    }

}
*/

priority_queue<pair<int, int> > pq ;

int frecv[200009] ;

int main()
{

    int n, f = 1 ;

    cin >> n ;

    while(n --)
    {

        int a, b, c ;

        cin >> a ;

        if(a == 1)
        {

            cin >> b ;

            pq.push({b * -1, f ++}) ;

        }
        if(a == 2)
        {

            cin >> b ;

            frecv[b] = 1 ;

        }
        if(a == 3)
        {

            while(frecv[pq.top().second])pq.pop() ;

            cout << pq.top().first * (-1) << "\n" ;

        }


    }

    return 0;
}