Cod sursa(job #2222674)

Utilizator stefan.botezStefan Botez stefan.botez Data 17 iulie 2018 17:48:30
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>

using namespace std;
const int max_size = 200005;
int n, nr, op, x, i, heap[max_size], poz[max_size], v[max_size];
void up(int p)
{
    if(p / 2 < 1) return;
    if(v[heap[p / 2]] > v[heap[p]])
    {
        swap(heap[p / 2], heap[p]);
        swap(poz[heap[p / 2]], poz[heap[p]]);
        up(p / 2);
    }
}
void down(int p)
{
    int fiu = p * 2;
    if(fiu > nr) return;
    if(fiu < nr && v[heap[fiu + 1]] < v[heap[fiu]]) fiu++;
    if(v[heap[p]] > v[heap[fiu]])
    {
        swap(heap[fiu], heap[p]);
        swap(poz[heap[fiu]], poz[heap[p]]);
        down(fiu);
    }
}
int main()
{
    freopen("heapuri.in", "r", stdin);
    freopen("heapuri.out", "w", stdout);
    scanf("%d", &n);
    for(; n; n--)
    {
        scanf("%d", &op);

        if(op == 1)
        {
            scanf("%d", &v[++i]);
            heap[++nr] = i;
            poz[i] = nr;
            up(nr);
        }
        else if(op == 2)
        {
            scanf("%d", &x);
            poz[heap[nr]] = poz[x];
            heap[poz[x]] = heap[nr];
            nr--;
            down(poz[x]);
        }
        else printf("%d\n", v[heap[1]]);
    }

    return 0;
}