Cod sursa(job #3124189)

Utilizator zzzzzZazaazaza zzzzz Data 27 aprilie 2023 10:48:35
Problema Heapuri Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>

int n, c, x, j, heap[200005], poz[200005];

void push(int p) {
    for(int hp = p >> 1; hp && heap[hp] > heap[p]; p = hp, hp /= 2) {
        std::swap(heap[hp], heap[p]);
        std::swap(poz[hp], poz[p]);
    }
}

void pop(const int& p) {
    int pz = 1;
    for(; poz[pz] != p; ++pz) {}
    heap[pz] = 1000000001;

    int son;
    do {
        son = 0;
        if ((pz << 1) <= j) {
            son = pz << 1;
            if (((pz << 1) + 1) <= j && heap[((pz << 1) + 1)] <= heap[(pz << 1)]) {
                son = ((pz << 1) + 1);
            }
            if (heap[son] >= heap[pz]) {
                son = 0;
            }
        }

        if (son) {
            std::swap(heap[pz], heap[son]);
            pz = son;
        }
    } while (son);
}

int main()
{
    freopen("heapuri.in", "r", stdin);
    freopen("heapuri.out", "w", stdout);

    std::cin >> n;
    for(int i = 1; i <= n; ++i) {
        std::cin >> c;
        switch(c) {
            case 1: {
                std::cin >> x;
                heap[++j] = x;
                poz[j] = j;
                push(j);
                break;
            }
            case 2: {
                std::cin >> x;
                pop(x);
                break;
            }
            default: std::cout << heap[1] << '\n';
        }
    }

    fclose(stdin);
    fclose(stdout);
    return 0;
}