Cod sursa(job #1694962)

Utilizator radarobertRada Robert Gabriel radarobert Data 26 aprilie 2016 12:57:32
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>

using namespace std;

const int MAXN = 200100;

int heap[MAXN], in_heap[MAXN], v[MAXN];
int heap_size = 0;

void swapValues(int i, int j)
{
    swap(heap[i], heap[j]);
    in_heap[heap[i]] = i;
    in_heap[heap[j]] = j;
}

void addHeap(int x)
{
    heap[++heap_size] = x;
    in_heap[x] = heap_size;
    int i = heap_size;
    while (v[heap[i]] < v[heap[(i>>1)]] && i > 1)
    {
        swapValues(i, (i>>1));
        i = (i>>1);
    }
}

void delHeap(int x)
{
    int i = in_heap[x];
    heap[i] = heap[heap_size--];
    in_heap[heap[i]] = i;
    in_heap[x] = 0;

    while (1)
    {
        int vmin = i;
        if ((i<<1) <= heap_size && v[heap[(i<<1)]] < v[heap[vmin]])
            vmin = (i<<1);
        if ((i<<1)+1 <= heap_size && v[heap[(i<<1)+1]] < v[heap[vmin]])
            vmin = (i<<1)+1;
        if (vmin != i)
        {
            swapValues(i, vmin);
            i = vmin;
        }
        else
            break;
    }
}

int main()
{
    ifstream in("heapuri.in");
    ofstream out("heapuri.out");

    int n;
    in >> n;
    int t, x;
    int m = 0;
    for (int i = 1; i <= n; i++)
    {
        in >> t;
        if (t == 1)
        {
            in >> x;
            v[++m] = x;
            addHeap(m);
        }
        else if (t == 2)
        {
            in >> x;
            delHeap(x);
        }
        else if (t == 3)
        {
            out << v[heap[1]] << '\n';
        }
    }

    return 0;
}