Cod sursa(job #1624627)

Utilizator radarobertRada Robert Gabriel radarobert Data 2 martie 2016 12:37:30
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <cstdio>

using namespace std;

int heap_size;
int heap[200002], in_heap[200002], v[200002];

void swapElements(int i, int j)
{
    int t = heap[i];
    heap[i] = heap[j];
    heap[j] = t;
    in_heap[heap[i]] = i;
    in_heap[heap[j]] = j;
}

void addToHeap(int x)
{
    heap[++heap_size] = x;
    in_heap[x] = heap_size;
    int i = heap_size;
    while (v[heap[i/2]] > v[heap[i]] && i > 1)
    {
        swapElements(i, i/2);
        i = i/2;
    }
}

void deleteElement(int x)
{
    heap[in_heap[x]] = 0;
    int i = in_heap[x];
    in_heap[x] = 0;
    while (1)
    {
        int vmin;
        if (2*i > heap_size)
            break;
        if (2*i == heap_size)
        {
            heap[i] = heap[2*i];
            in_heap[heap[i]] = i;
            i = 2*i;
            break;
        }
        vmin = 2*i;
        if (v[heap[2*i]] > v[heap[2*i+1]])
            vmin++;
        heap[i] = heap[vmin];
        in_heap[heap[i]] = i;
        i = vmin;
    }
    heap_size--;
}

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

    int n, t;
    scanf("%d", &n);

    v[0] = 0x3f3f3f3f;
    for (int i = 1, k = 0; i <= n; i++)
    {
        scanf("%d", &t);
        if (t == 1)
        {
            ++k;
            scanf("%d", &v[k]);
            addToHeap(k);
        }
        else if (t == 2)
        {
            int x;
            scanf("%d", &x);
            deleteElement(x);
        }
        else
        {
            printf("%d\n", v[heap[1]]);
        }
    }

    return 0;
}