Cod sursa(job #806449)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 2 noiembrie 2012 20:42:03
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<cstdio>
#include<algorithm>
#include<deque>
#define nr first
#define in second
using namespace std;
deque<pair<int,int> > H;
int a[1000020];
void heapdown(int P,int L)
{
    int F=P*2;
    if(F>L) return;
    if(H[F].nr>H[F+1].nr) F++;
    if(H[F].nr<H[P].nr)
    {
        swap(a[H[F].in],a[H[P].in]);
        swap(H[F],H[P]);
        heapdown(F,L);
    }
}
void heapup(int F)
{
    int P=F/2;
    if(P==0) return;
    if(H[P].nr>H[F].nr)
    {
        swap(a[H[F].in],a[H[P].in]);
        swap(H[P],H[F]);
        heapup(P);
    }
}
int main()
{
    int n,i=0,op,x,j=0;
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&n);
    H.push_back(make_pair(0,0));
    for(;n;n--)
    {
        scanf("%d",&op);
        if(op==1)
        {
            scanf("%d",&x);
            i++;j++;
            H.push_back(make_pair(x,j));
            a[j]=j;
            heapup(i);
        }
        else if(op==2)
        {
            scanf("%d",&x);
            H[a[x]].nr=H[i].nr;
            H[a[x]].in=H[i].in;
            a[H[i].in]=a[x];
            i--;
            H.pop_back();
            heapup(a[x]);
            heapdown(a[x],i);
            a[x]=0;
        }
        else if(op==3)
        {
            printf("%d\n",H[1].nr);
        }
    }
    return 0;
}