Cod sursa(job #976099)

Utilizator andrettiAndretti Naiden andretti Data 22 iulie 2013 15:59:43
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<stdio.h>
#define maxn 200005
using namespace std;

int n,nh,nr;
int h[maxn],pos[maxn],node[maxn];

void swap(int i,int j)
{
    int aux;
    aux=h[i];
    h[i]=h[j];
    h[j]=aux;
    pos[h[i]]=i;
    pos[h[j]]=j;
}

void heap_up(int k)
{
    if(k<=1) return;
    int i=k/2;
    if(h[k]<h[i])
    {
        swap(i,k);
        heap_up(i);
    }
}

void heap_dw(int k)
{
    int i=2*k;
    if(i<=nh)
    {
        if(i+1<=nh && h[i+1]<h[i]) i++;
        if(h[i]<h[k])
        {
            swap(i,k);
            heap_dw(i);
        }
    }
}

void add(int x)
{
    h[++nh]=x;
    pos[x]=nh;
    node[nr]=x;
    heap_up(nh);
}

void del(int x)
{
    int k=node[x];
    int posk=pos[k];
    swap(posk,nh);
    nh--;
    if(posk<=nh) heap_dw(posk);
}


void solve()
{
    int type,x;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&type);
        if(type<3)
        {
            scanf("%d",&x);
            if(type==1) nr++,add(x);
            else del(x);
        }
        else printf("%d\n",h[1]);
    }
}

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

    solve();

    fclose(stdin);
    fclose(stdout);
    return 0;
}