Cod sursa(job #1647897)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 10 martie 2016 22:41:07
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>

#define F first
#define S second

#define dad (node >> 1)
#define leftSon (node << 1)
#define rightSon ((node << 1) | 1)

using namespace std;

const int Nmax = 2e5 + 10;

int pos[Nmax] , nr , k;
pair < int , int > H[Nmax];

int best(int x , int y)
{
    return (H[x].F < H[y].F) ? x : y;
}

void suap(int x , int y)
{
    swap(H[x].F , H[y].F);
    swap(H[x].S , H[y].S);
    swap(pos[H[x].S] , pos[H[y].S]);
}

void heapup(int node)
{
    if (node == 1) return;

    if (best(dad , node) == node)
    {
        suap(dad , node);
        heapup(dad);
    }
}

void heapdown(int node)
{
    int to;
    bool l = 0, r = 0;
    if (leftSon <= nr && best(node , leftSon) == leftSon) l = 1;
    if (rightSon <= nr && best(node , rightSon) == rightSon) r = 1;

    if (!l && !r) return;

    if (l && r) to = best(leftSon , rightSon);
    else if (l) to = leftSon;
    else if (r) to = rightSon;

    suap(node , to);
    heapdown(to);
}

void add()
{
    int x;
    scanf("%d", &x);

    pos[++k] = ++nr;
    H[nr] = {x , k};

    heapup(nr);
}

void del()
{
    int x;
    scanf("%d", &x);

    x = pos[x];
    int p = x;
    suap(x , nr);
    nr--;

    heapdown(p);
}

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

    int n , op;
    for (scanf("%d", &n); n ; --n)
    {
        scanf("%d", &op);
        if (op == 1) add();
        if (op == 2) del();
        if (op == 3) printf("%d\n", H[1].F);
    }

    return 0;
}