Cod sursa(job #2294027)

Utilizator SemetgTemes George Semetg Data 1 decembrie 2018 20:25:48
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#define N_MAX 200005
using namespace std;

ifstream in { "heapuri.in" };
ofstream out { "heapuri.out" };

int n, timp;
int heap[N_MAX], t[N_MAX], t_ind[N_MAX];

inline void swap_nodes(int i, int j) {
    swap(t_ind[i], t_ind[j]);
    swap(t[t_ind[i]], t[t_ind[j]]);
    swap(heap[i], heap[j]);
}

inline int min_child(int i) {
    int minim { 2 * i };
    if (minim + 1 <= n && heap[minim + 1] < heap[minim])
        ++minim;
    return minim;
}

void heap_up(int i) {
    for (; i / 2 && heap[i] < heap[i / 2]; i /= 2)
        swap_nodes(i, i / 2);
}

void heap_down(int i) {
    while (i * 2 <= n) {
        int i_min { min_child(i) };
        
        if (heap[i_min] > heap[i])
            break;
        
        swap_nodes(i, i_min);
        i = i_min;
    }
}

void insert(int val) {
    heap[++n] = val;
    t[++timp] = n;
    t_ind[n] = timp;
    
    heap_up(n);
}

void erase(int time_entered) {
    int poz { t[time_entered] };
    if (poz == n--)
        return;
    
    swap_nodes(poz, n + 1);
    
    if (poz / 2 && heap[poz] < heap[poz / 2]) {
        heap_up(poz);
    } else if (2 * poz <= n) {
        int i_min { min_child(poz) };
        if (heap[i_min] < heap[poz])
            heap_down(poz);
    }
}

int main() {
    int m; in >> m;
    
    while (m--) {
        int cod, val { 0 };
        in >> cod;
        if (cod == 1 || cod == 2)
            in >> val;
        
        if (cod == 1)
            insert(val);
        else if (cod == 2)
            erase(val);
        else
            out << heap[1] << '\n';
    }
}