Cod sursa(job #976118)

Utilizator andrettiAndretti Naiden andretti Data 22 iulie 2013 16:31:17
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<stdio.h>
#define maxn 200005
using namespace std;

int n,nh,nr;
int v[maxn];
int h[maxn],pos[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(v[h[k]]<v[h[i]])
    {
        swap(i,k);
        heap_up(i);
    }
}

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

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

void del(int x)
{
    int posk=pos[x];
    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) add(x);
            else del(x);
        }
        else printf("%d\n",v[h[1]]);
    }
}

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

    solve();

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