Cod sursa(job #1239270)

Utilizator vladdy47Bucur Vlad Andrei vladdy47 Data 8 octombrie 2014 17:19:25
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
# include <cstdio>
# include <algorithm>
using namespace std;

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



void HeapUp (int m)
{
    if (m<=1) return;

    if (a[m].val<a[m/2].val)
    {   swap (poz[a[m].p],poz[a[m/2].p]);
        swap(a[m],a[m/2]);
        HeapUp(m/2);
    }
}
void HeapDown (int m, int r)
{
    int St,Dr;
    if(2*r<=n)
    {
        St=a[2*r].val;
        if (2*r+1<=n) Dr=a[2*r+1].val;
        else Dr=St-1;
        if (St<Dr || (St>Dr && Dr!=0))
        {
            if (a[r].val>a[2*r].val)
            {   swap (poz[a[r].p],poz[a[r/2].p]);
                swap(a[2*r].val,a[r].val);
                HeapDown(m,2*r+1);
            }
        }
        else
        {
            if (a[r].val<a[2*r+1].val)
            {
                swap(a[2*r+1],a[r]);
                HeapDown(n,2*r+1);
            }
        }

    }

}
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[m]=pozitie;
                HeapUp(m);

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

}


return 0;
}