Cod sursa(job #1491416)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 25 septembrie 2015 12:07:02
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>
#include <vector>
using namespace std;

struct Heap{
public:
    Heap();
    int top();
    void Swap(int x, int y);
    void push(int val);
    void up(int down);
    void pop(int poz);
    void down(int up);
private:
    int n, el;
    vector<int> h, nr, p;
}h;

Heap::Heap() : n(0), el(0)
{
    h.push_back(0);
    p.push_back(0);
    nr.push_back(0);
}

int Heap::top()
{
    return nr[h[1]];
}

void Heap::Swap(int x, int y)
{
    swap(h[x], h[y]);
    swap(p[h[x]], p[h[y]]);
}

void Heap::push(int val)
{
    h.push_back(++el);
    p.push_back(++n);
    nr.push_back(val);
    up(n);
}

void Heap::up(int down)
{
    int up = down / 2;
    while ( up && nr[h[up]] > nr[h[down]] )
    {
        Swap(up, down);
        down = up;
        up /= 2;
    }
}

void Heap::pop(int elem)
{
    if ( p[elem] == n )
    {
        --n;
        h.pop_back();
        return;
    }
    h[p[elem]] = h[n--];
    p[h[p[elem]]] = p[elem];
    h.pop_back();
    down(p[elem]);
}

void Heap::down(int up)
{
    int down = 2 * up;
    while ( ( down <= n && nr[h[up]] > nr[h[down]] ) || ( down < n && nr[h[up]] > nr[h[down+ 1]] ) )
    {
        if ( down < n && nr[h[down]] > nr[h[down + 1]] )
            ++down;
        Swap(up, down);
        up = down;
        down *= 2;
    }
}

ifstream is("heapuri.in");
ofstream os("heapuri.out");

int main()
{
    int m, tip, val;
    is >> m;
    while ( m-- )
    {
        is >> tip;
        if ( tip != 3 )
        {
            is >> val;
            if ( tip == 1 )
                h.push(val);
            else
                h.pop(val);
        }
        else
            os << h.top() << "\n";
    }
    is.close();
    os.close();
    return 0;
}