Cod sursa(job #2204711)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 16 mai 2018 21:23:56
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.83 kb
#include <bits/stdc++.h>

using namespace std;

#define FILE_IO

class PairingHeap
{
public:
    struct H
    {
        int val = 0;
        int id = 0;
        vector<H*> nxt;

        H() { ; }
        H(int _val, int _id) { val = _val, id = _id; }
    };

    H *R;
    vector<H*> pts;
    int N = 0;

    int getMin()
    {
        if(R == 0)   return -1;
        return R -> val;
    }

    void deleteMin()
    {
        if(R == 0)  return;
        erase(R);
    }

    H* joinPairs(vector<H*> v)
    {
        vector<H*> newv;
        for(int i = 0; i < v.size(); i += 2)
        {
            if(i + 1 < v.size())    newv.push_back(join(v[i], v[i + 1]));
            else    newv.push_back(v[i]);
        }
        H* nd = 0;
        for(int i = int(newv.size()) - 1; i >= 0; i--)
            nd = join(nd, newv[i]);
        return nd;
    }

    void swapH(H *&a, H *&b)
    {
        swap(a -> val, b -> val);
        swap(a -> id, b -> id);
        swap(a -> nxt, b -> nxt);
    }

    void cloneH(H *&a, H *&b)
    {
        if(b == 0 || b -> id == -1)
        {
            a -> id = -1;
            a = 0;
            //pts[a -> id] = 0;
            //delete a;
            b = 0;
            return;
        }
        a -> val = b -> val;
        a -> id = b -> id;
        a -> nxt = b -> nxt;
        pts[a -> id] = a;
        //delete b;
        b -> id = -1;
        b = 0;
    }

    H* join(H *&a, H *&b)
    {
        if(a == 0)  return b;
        if(b == 0)  return a;
        if(a -> id == -1)   { a = 0; return b; }
        if(b -> id == -1)   { b = 0; return a; }

        if(a -> val > b -> val)
            swapH(a, b);

        a -> nxt.push_back(b);
        pts[a -> id] = a;
        pts[b -> id] = b;
        return a;
    }

    void erase(H *&a)
    {
        if(a == 0)  return;
        vector<H*> nxt = a -> nxt;

        H *b = joinPairs(nxt);

        cloneH(a, b);
    }

    void insert(int x)
    {
        H *nd = new H(x, N);
        N++;
        pts.push_back(nd);

        R = join(R, nd);
    }

    void erase(int id)
    {
        erase(pts[id]);
    }

    PairingHeap() { ; }
};
PairingHeap hp;

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

    int Q;
    scanf("%d", &Q);
    for(int q = 1; q <= Q; q++)
    {
        int op;
        scanf("%d", &op);
        if(op == 1)
        {
            int x;
            scanf("%d", &x);
            hp.insert(x);
        }
        else if(op == 2)
        {
            int x;
            scanf("%d", &x);
            hp.erase(x - 1);
        }
        else if(op == 3)
        {
            int x = hp.getMin();
            printf("%d\n", x);
        }
    }

    return 0;
}