Cod sursa(job #1242722)

Utilizator vladdy47Bucur Vlad Andrei vladdy47 Data 14 octombrie 2014 22:18:16
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
# include <cstdio>
# include <algorithm>
using namespace std;


struct da
{
    int val,p;
};
da a[200001];
int m=0,n,i,COMANDA,pozitie,x,L;
int poz[200001];

void swapp(int m,int t)
{
    swap(a[m].val,a[t].val);
    swap(a[m].p,a[t].p);
    swap(poz[a[m].p],poz[a[t].p]);
}
void HeapUp (int m)
{
    if (m<=1) return;

    if (a[m].val<a[m/2].val)
    {
        swapp(m,m/2);
        HeapUp(m/2);
    }
}
void HeapDown(int r,int m)
{
    int st,dr;
    if (2*r<=m)
    {
        st=a[2*r].val;
        if (2*r+1<=m)dr=a[2*r+1].val;
        else dr=st+1;
        if (st<=dr)
        {
            if (st<a[r].val)
            {
                swapp(2*r,r);
                HeapDown(2*r,m);
            }
        }
        else
        {
            if (dr<a[r].val)
            {
                swapp(2*r+1,r);
                HeapDown(2*r+1,m);
            }
        }
    }
}
int main ()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&n);
    for (i=1; i<=n; i++)
    {

        scanf("%d",&COMANDA);
        if (COMANDA==1)
        {

            pozitie++;
            scanf("%d",&x);
            a[++m].val=x;
            a[m].p=pozitie;
            poz[pozitie]=m;
            HeapUp(m);


        }

        if (COMANDA==2)
        {
            scanf("%d",&x);
            L=poz[x];
            swapp(poz[x],m);
            m--;
            HeapDown(L,m);
        }
        if (COMANDA==3)
        {
            printf("%d\n",a[1].val);
        }

    }


    return 0;
}