Cod sursa(job #1856122)

Utilizator jason2013Andronache Riccardo jason2013 Data 24 ianuarie 2017 15:45:50
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <stdio.h>

#define MAX 200005

int N, K, poz[MAX], heap[MAX], v[MAX], nr;

void swap(int x, int y)
{
    int a;
    a = heap[x]; heap[x] = heap[y]; heap[y] = a;
}

void urc(int k)
{
    if (k > 1)
        if (v[ heap[k] ] < v[ heap[k / 2] ])
        {
            poz[ heap[k] ] = k / 2; poz[ heap[k / 2] ] = k;
            swap(k, k / 2);
            urc(k / 2);
        }
}

void cobor(int k)
{
    int min, st, dr;
    st = 2 * k;
    dr = st + 1;

    min = k;
    if (st <= K) {if (v[ heap[k] ] > v[ heap[st] ]) min = st;}
    if (dr <= K) {if (v[ heap[min] ] > v[ heap[dr] ]) min = dr;}

    poz[ heap[k] ] = min;   poz[ heap[min] ] = k;
    swap(k, min);
    if (min != k) cobor(min);
}

void sterg(int k)
{
    poz[ heap[k] ] = K; poz[ heap[K] ] = k;
    swap(k, K);
    K--;
    cobor(k);
}




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

    int i, op, x;

    scanf("%d", &N);
    for (i = 1; i <= N; i++)
    {
        scanf("%d",&op);
        switch (op)
        {
        case 1:
            {
                scanf("%d", &v[++nr]);
                K++;
                heap[K] = nr; poz[nr] = K;
                urc(K);
                break;
            }
        case 2:
            {
                scanf("%d", &x);
                sterg(poz[x]);
                break;
            }
        case 3:
            {
                printf("%d\n",v[ heap[1] ]);
                break;
            }
        }
    }
    return 0;
}