Cod sursa(job #2405107)

Utilizator ShumaherAdasga Shumaher Data 13 aprilie 2019 22:29:53
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.8 kb
//Cautarea maximului/minimului in O(1)
//Crearea unei structuri de heap dintr-un vector oarecare in O(N)
//Eliminarea unui element in O(log N)
//Inserarea unui element in O(log N)
//Sortarea elementelor din heap in O(N log N)
//MIN-HEAP
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
const int MAX_HEAP_SIZE = 10000;
typedef struct {
    int H[MAX_HEAP_SIZE];
    int N = 0;


    inline int father(int nod) { //Returneaza tatal
        return nod >> 1;
    }

    inline int son_left(int nod) { //Returneaza fiul stang
        return nod << 1;
    }
    inline int son_right(int nod) { //Returneaza fiul drept
        return (nod << 1) + 1;
    }
    void sift_down(int K) { //Muta nodul K in jos
        int son;
        do {
            son = 0;
            if (son_left(K) <= N) { //Alegem cel mai mic fiu
                son = son_left(K);
                if(son_right(K) <= N && H[son_right(K)] < H[son])
                    son = son_right(K);
            }
            if(H[son] >= H[K])
                son = 0;
            if(son) { //Schimbam nodurile
                swap(H[K], H[son]);
                K = son;
            }

        } while(son);
    }
    inline void sift_up(int K) { //Muta nodul in sus
        int key = H[K];
        while(K > 0 && key < H[father(K)]) {
            H[K] = H[father(K)];
            K = father(K);
        }
        H[K] = key;
    }

    inline void insert(int key) { //Adauga un nod in heap
        H[++N] = key;
        sift_up(N);
    }
    inline void cut(int K) { //Taie nodul K din heap
        H[K] = H[N];
        N--;
        if(K > 0 && H[K] < H[father(K)])
            sift_up(K);
        else
            sift_down(K);
    }
    void heapify() //Creeaza un heap dintr-un vector oarecare
    {
        for(int i=N/2;i>0;i--)
            sift_down(i);
    }
    void afis() { //Afiseaza heap-ul
        for(int i = 1; i <= N; i++)
            cout << H[i] << " ";
        cout << endl;
    }
    int min() { //Returneaza minimul
        return H[1];
    }
    inline int search(int Key) {
        for(int i = 1; i <= N; i++)
            if(H[i] == Key)
                return i;
    }
} Heap;
int main() {
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    Heap X;
    int A[200001];
    int j = 0;
    int N, tip, x;
    scanf("%d", &N);
    for(int i = 1; i <= N; i++) {
        scanf("%d", &tip);
        if(tip == 1) {
            scanf("%d", &x);
            X.insert(x);
            ++j;
            A[j] = x;
        } else if(tip == 2) {
            scanf("%d", &x);
            X.cut(X.search(A[x]));
        } else {
            printf("%d\n",X.H[1]);
        }

    }
    return 0;
}