Cod sursa(job #1354773)

Utilizator pitradaPit-Rada Ionel-Vasile pitrada Data 21 februarie 2015 23:51:02
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<stdio.h>

int v[200002], pv[200002];
int H[200002], pH, pH1, q, nH;
int n,a,c,x,i;

void adaug(int poz)
{
    int i,p,x;
    x=v[poz];
    nH++;
    // urcarea
    i=nH;
    p=(i>>1);
    pH=H[p];
    while(p && v[pH]>x)
    {
        H[i]=pH;
        pv[pH]=i;
        i=p;
        p=(i>>1);
        pH=H[p];
    }
    H[i]=poz;
    pv[poz]=i;
}
void sterg(int poz)
{
    int p,i;
    v[poz]=-1;
    q=H[nH];
    nH--;
    p=pv[poz];
    while((p<<1)<=nH)
    {
        i=(p<<1);
        pH=H[i];
        pH1=H[i+1];
        if(i+1<=nH && v[pH1]<v[pH])
        {
            pH=pH1;
            i++;
        }
        if(v[pH]<v[q])
        {
            H[p]=pH;
            pv[pH]=p;
            p=i;
        }
        else break;
    }
    H[p]=q;
    pv[q]=p;
}

int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&n);
    c=0;
    nH=0;
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a);
        if(a==1)
        {
            scanf("%d",&x);
            c++;
            v[c]=x;
            adaug(c);
        }else
        if(a==2)
        {
            scanf("%d",&x);
            sterg(x);
        }else
        {
            printf("%d\n",v[H[1]]);
        }
    }

    fclose(stdout);
    fclose(stdin);
    return 0;
}