Cod sursa(job #1238302)

Utilizator OnimushaLordTiberiu Copaciu OnimushaLord Data 6 octombrie 2014 18:13:19
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
# include <cstdio>
# define N 500001
# define stanga 2*p
# define dreapta 2*p+1

using namespace std;
int a[N],H[N],poz[N],i,n,op,nr,k,k1;

void swap(int x,int y)
{
    int aux;
    aux=H[x];
    H[x]=H[y];
    H[y]=aux;
    poz[H[x]]=x;
    poz[H[y]]=y;
}
void HeapUp(int k)
{
    int t;
    if(k<=1) return;
    t=k/2;
    if(a[H[k]]<a[H[t]])
    {
        swap(k,t);
        HeapUp(t);
    }
}
void HeapDown(int p, int k)
{
    int i,Dr,St;
    if(stanga<=k)
    {
        St=a[H[stanga]];
        if(dreapta<=k) Dr=a[H[dreapta]];
        else Dr=St+1;
        if(St<Dr) i=stanga;
        else i=stanga+1;
        if(a[H[p]]>a[H[i]])
        {
            swap(p,i);
            HeapDown(i,k);
        }
    }
}
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 || op==2) scanf("%d", &nr);
        if(op==1)
        {
            a[++k]=nr;
            H[++k1]=k;
            poz[k]=k1;
            HeapUp(k1);
        }
        if(op==2)
        {
            int x=poz[nr];
            swap(poz[nr],k1);
            k1--;
            HeapDown(x,k1);
        }
        if(op==3) printf("%d\n", a[H[1]]);
    }
}