Cod sursa(job #3362313)

Utilizator gugalcromMuntoiu Vlad-Ioan gugalcrom Data 6 august 2026 10:16:31
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

struct Node {
    int value;
    int index;
};

class Heap {
    vector<Node> v;
    vector<int> entered;
    int count = 0;
    void swap_nodes(int a, int b) {
        swap(v[a], v[b]);
        entered[v[a].index] = a;
        entered[v[b].index] = b;
    }
    int get_min_child(int i) {
        if (2*i + 1 >= v.size()) {
            if (2*i < v.size()) {
                return 2*i;
            }
            return -1;
        }
        if (v[2*i + 1].value > v[2*i].value) {
            return 2*i;
        }
        return 2*i + 1;
    }
public:
    Heap() {
        v.push_back({-1, -1});
    }
    void insert(int value) {
        v.push_back({value, count++});
        entered.push_back(v.size() - 1);

        int i = v.size() - 1;
        while (i > 1 && v[i/2].value > v[i].value) {
            swap_nodes(i, i/2);
            i /= 2;
        }
    }
    int get_minimum() {
        return v[1].value;
    }
    void erase(int x) {
        int i = entered[x];
        swap_nodes(i, v.size() - 1);
        entered[v.back().index] = -1;
        v.pop_back();

        if (i == v.size()) {
            return;
        }

        while (i > 1 && v[i/2].value > v[i].value) {
            swap_nodes(i, i/2);
            i /= 2;
        }
        int child;
        while ((child = get_min_child(i)) != -1 && v[i].value > v[child].value) {
            swap_nodes(i, child);
            i = child;
        }
    }
};

int main() {
    ifstream fin("heapuri.in");
    ofstream fout("heapuri.out");
    Heap heap;
    int Q;
    fin >> Q;
    for (int q = 0; q < Q; ++q) {
        int opcode;
        fin >> opcode;
        switch (opcode) {
            int x;
        case 1:
            fin >> x;
            heap.insert(x);
            break;
        case 2:
            fin >> x;
            heap.erase(x-1);
            break;
        case 3:
            fout << heap.get_minimum() << '\n';
            break;
        }
    }
    return 0;
}