Cod sursa(job #1182515)

Utilizator gapdanPopescu George gapdan Data 6 mai 2014 18:53:34
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<cstdio>
#include<algorithm>
#define pr(a) (a/2)
#define stg(a) (a*2)
#define drt(a) (a*2+1)
using namespace std;
int nr,l;
int H[200005],v[200005],pos[200005];
void push(int k)
{
    while (k/2>0 && v[H[k]]<v[H[pr(k)]])
    {
      swap(H[k],H[pr(k)]);
      pos[H[k]]=k;
      pos[H[pr(k)]]=k/2;
      k=k/2;
    }
}
void pop(int x)
{
    int y=0;
    while (x!=y)
    {
        y=x;
        int st=stg(y);
        int dr=drt(y);
        if (st<=l && v[H[x]]>v[H[st]]) x=st;
        if (dr<=l && v[H[x]]>v[H[dr]]) x=dr;
        swap(H[x],H[y]);
        pos[H[x]]=x;
        pos[H[y]]=y;
    }
}
int main()
{
    int i,n,op,x;
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&n);
    for (i=1;i<=n;++i)
    {
        scanf("%d",&op);
        if (op==1)
        {
            scanf("%d",&x);
            ++nr;v[nr]=x;
            ++l;H[l]=nr;
            pos[nr]=l;
            push(l);
        }
        else
        if (op==2)
        {
            scanf("%d",&x);
            v[x]=-1;
            push(pos[x]);
            pos[H[1]]=0;
            H[1]=H[l--];
            pos[H[1]]=1;
            if (l>1) pop(1);
        }
        else printf("%d\n",v[H[1]]);
    }
    return 0;
}