Cod sursa(job #1598606)

Utilizator TibiraducanuTiberiu Raducanu Tibiraducanu Data 13 februarie 2016 01:18:01
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <cstdio>
#include <algorithm>
using namespace std;

int h[200005],ins[200005],poz[200005],lung;

void up(int x)
{
    if(h[x]<h[x/2])
    {
        swap(poz[h[x]],poz[h[x/2]]);
        swap(h[x],h[x/2]);

        up(x/2);
    }
}

void down(int x)
{
    if(2*x>lung) return;

    if(2*x==lung)
    {
        swap(poz[h[x]],poz[h[2*x]]);
        swap(h[x],h[2*x]);
        return;
    }

    if(h[2*x]<h[x] or h[2*x+1]<h[x])
    {
        int loc;

        if(h[2*x]<h[2*x+1]) loc=2*x;
        else loc=2*x+1;

        swap(poz[h[x]],poz[h[loc]]);
        swap(h[x],h[loc]);

        down(loc);
    }
}

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

    int n,cnt=0,p,x,place;

    scanf("%d",&n);

    for(int i=1;i<=n;i++)
    {
        scanf("%d",&p);
        if(p==1)
        {
            scanf("%d",&x);

            cnt++;
            ins[cnt]=x;
            lung++;
            h[lung]=x;
            poz[x]=lung;

            up(lung);
        }
        if(p==2)
        {
            scanf("%d",&x);

            place=poz[ins[x]];

            h[place]=h[lung];
            poz[h[place]]=place;
            lung--;

            up(place);
            down(place);
        }
        if(p==3) printf("%d\n",h[1]);
    }

    return 0;
}