Cod sursa(job #808591)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 6 noiembrie 2012 22:35:17
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<cstdio>
#include<vector>
#include<algorithm>
#define nr first
#define in second
using namespace std;
int a[200005];
pair<int,int> H[200005];
int n,i,op,x,j,k;
void heapdown(int P,int L)
{
    int F=2*P;
    if(F>L) return;
    if(H[F+1].nr<H[F].nr) F++;
    if(H[F].nr<H[P].nr)
    {
        swap(a[H[P].in],a[H[F].in]);
        swap(H[F],H[P]);
        heapdown(F,L);
    }
}
void heapup(int F)
{
    int P=F/2;
    if(!P) return;
    if(H[F].nr<H[P].nr)
    {
        swap(a[H[P].in],a[H[F].in]);
        swap(H[F],H[P]);
        heapup(P);
    }
}
int main()
{
    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);
            H[++j]=make_pair(x,j);
            a[++k]=k;
            heapup(j);
        }
        else if(op==2)
        {
            scanf("%d",&x);
            H[a[x]].nr=H[j].nr;
            H[a[x]].in=H[j].in;
            a[H[j].in]=a[x];
            j--;
            heapup(a[x]);
            heapdown(a[x],j);
            a[x]=0;
        }
        else if(op==3)
        {
            printf("%d\n",H[1].nr);
        }
        //for(int ii=1;ii<=j;ii++) printf("%d ",H[ii].nr);
        //printf("\n");
    }
    return 0;
}