Cod sursa(job #3243203)

Utilizator catalinmarincatalinmarin catalinmarin Data 16 septembrie 2024 15:59:30
Problema Heapuri Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

int sz = 0;
bool deleted[int(2e5) + 5];

struct elem{
    int valoare;
    int ordin;
};

elem heap[int(2e5) + 5];

void insert(elem nod){
    heap[nod.ordin] = nod;
    int poz = nod.ordin;
    while (poz > 1 && heap[poz / 2].valoare >= nod.valoare){
        swap(heap[poz / 2], heap[poz]);
        poz /= 2;
    }
}
void erase(){
    swap(heap[1], heap[sz]);
    heap[sz] = {0, 0};
    sz--;
    int poz = 1;
    while (2 * poz <= sz){
        if (heap[2 * poz].valoare && heap[2 * poz + 1].valoare){
            if (heap[poz].valoare > heap[2 * poz].valoare || heap[poz].valoare > heap[2 * poz + 1].valoare){
                if (heap[2 * poz].valoare <= heap[2 * poz + 1].valoare){
                    swap(heap[2 * poz], heap[poz]);
                    poz = 2 * poz;
                } else {
                    swap(heap[2 * poz + 1], heap[poz]);
                    poz = 2 * poz + 1;
                }
            }
        } else if (heap[2 * poz].valoare && heap[2 * poz].valoare < heap[poz].valoare){
            swap(heap[poz], heap[2 * poz]);
            poz = 2 * poz;
        } else {
            return;
        }
    }
     return;
}
int main(){
    int n;
    fin >> n;
    for (int i = 1; i <= n; i++){
        elem nod;
        int cod;
        fin >> cod;
        if (cod == 1){
            sz++;
            fin >> nod.valoare;
            nod.ordin = sz;
            insert(nod);
        } else if (cod == 2){
            int ordin;
            fin >> ordin;
            deleted[ordin] = true;
        } else if (cod == 3){
            while (deleted[heap[1].ordin] == true) {
                erase();
            }
            fout << heap[1].valoare << '\n';
        }
    }
    return 0;
}