Cod sursa(job #3332575)

Utilizator catalinmarincatalinmarin catalinmarin Data 7 ianuarie 2026 17:21:40
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

struct node {
    int nr;
    int id;
};

bool deleted[int(2e5) + 5] = {0};
node hp[int(9e5) + 5] = {0};

void addHeap(int pos) {

    if (hp[pos].nr < hp[pos / 2].nr && (pos / 2) >= 1) {
        swap(hp[pos], hp[pos / 2]);
        addHeap(pos / 2);
    }

}

void removeTop(int pos) {
    //
    // fout << hp[pos].nr << " " << hp[pos].id << '\n';
    // fout << hp[2 * pos].nr << " " << hp[2 * pos].id << '\n';
    // fout << hp[2 * pos + 1].nr << " " << hp[2 * pos + 1].id << '\n';
    // fout << '\n';

    if (hp[2 * pos].nr == 0 && hp[2 * pos + 1].nr == 0) {
        hp[pos].nr = 0;
        hp[pos].id = 0;
        return;
    } else if (hp[2 * pos].nr == 0 && hp[2 * pos + 1].nr != 0) {
        swap(hp[pos], hp[2 * pos + 1]);
        removeTop(2 * pos + 1);
        return;
    } else if (hp[2 * pos].nr != 0 && hp[2 * pos + 1].nr == 0) {
        swap(hp[pos], hp[2 * pos]);
        removeTop(2 * pos);
        return;
    }

    if (hp[2 * pos].nr <= hp[2 * pos + 1].nr) {
        swap(hp[pos], hp[2 * pos]);
        removeTop(2 * pos);
        return;
    } else if (hp[2 * pos].nr >= hp[2 * pos + 1].nr) {
        swap(hp[pos], hp[2 * pos + 1]);
        removeTop(2 * pos + 1);
        return;
    }

}

int main() {
    int currNodes = 0;
    int m;
    fin >> m;

    for (int i = 1; i <= m; i++) {
        int op;
        fin >> op;
        if (op == 1) {
            int nr;
            fin >> nr;
            currNodes++;
            hp[currNodes].nr = nr;
            hp[currNodes].id = currNodes;
            addHeap(currNodes);

        } else if (op == 3) {
            int temp_id;
            while (deleted[hp[1].id] == true) {
                temp_id = hp[1].id;
                removeTop(1);
                deleted[temp_id] = false;
            }
            fout << hp[1].nr << '\n';
        } else if (op == 2) {
            int pos;
            fin >> pos;
            deleted[pos] = true;
        }
    }
    return 0;
}