Cod sursa(job #3127725)

Utilizator MAlex2019Melintioi George Alexandru MAlex2019 Data 7 mai 2023 19:07:54
Problema Heapuri Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int maxn = 2e5;
bool enabled[maxn + 1];

struct node {
    int val, id;

    node(int val = 0, int id = 0, bool enabled = true) {
        this->val = val;
        this->id = id;
    }
};
node heap[maxn + 1];

void insert(node x, int &last) {
    heap[last] = x;
    int curr = last;
    while (curr > 1 && heap[curr/2].val > heap[curr].val) {
        swap(heap[curr/2], heap[curr]);
        curr /= 2;
    }
    last++;
}  

void pop(int &last) {
    swap(heap[1], heap[--last]);
    int curr = 1;
    while (curr*2 < last) {
        int choose = curr, st = curr*2, dr = curr*2 + 1;
        if (heap[st].val < heap[choose].val)
            choose = st;
        if (heap[dr].val < heap[choose].val)
            choose = dr;
        if (curr == choose)
            break;
        swap(heap[curr], heap[choose]);
        curr = choose;
    }
}

void printHeap(int &last) {
    for (int i = 1; i < last; i++)
        cout << '(' << heap[i].val << ',' << heap[i].id << ") ";
    cout << '\n';
}

void remove(int x, int &last) {
    enabled[x] = false;
}

int main() {
    int n;
    fin >> n;
    int last = 1, cnt = 1;
    for (int i = 1; i <= n; i++) {
        int op;
        fin >> op;
        if (op == 3) {
            while (!enabled[heap[1].id])
                pop(last);
            fout << heap[1].val << '\n';
        }
        else { 
            int x;
            fin >> x;
            if (op == 1) {
                enabled[cnt] = true;    
                insert(node(x, cnt++), last);
            }
            else
                remove(x, last);
        }
        //printHeap(last);
    }

    return 0;
}