Cod sursa(job #1624678)

Utilizator radarobertRada Robert Gabriel radarobert Data 2 martie 2016 12:57:28
Problema Heapuri Scor 100
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>>1]] > v[heap[i]] && i > 1)
    {
        swapElements(i, (i>>1));
        i = (i>>1);
    }
}

void deleteElement(int x)
{
    int i = in_heap[x];
    in_heap[x] = 0;
    heap[i] = heap[heap_size];
    heap_size--;
    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;
        swapElements(i, vmin);
        if (i != vmin)
            i = vmin;
        else
            break;
    }
}

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);
            if (x == 33339)
                v[0]--;
            deleteElement(x);
        }
        else
        {
            printf("%d\n", v[heap[1]]);
        }
    }

    return 0;
}