Cod sursa(job #1363461)

Utilizator misu007Pogonaru Mihai misu007 Data 26 februarie 2015 23:23:13
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <algorithm>
using namespace std;

int n,a[200001],poz[200001],poz1[200001];

void coboara(int k)
{
    if(k<<1>n) return;
    int j=k<<1;
    if(j+1<n) if(a[j+1]<a[j]) ++j;
    while(a[k]>a[j])
    {
        swap(a[k],a[j]);
        swap(poz1[k],poz1[j]);
        swap(poz[poz1[k]],poz[poz1[j]]);
        k=j;
        if(k<<1>n) return;
        j=k<<1;
        if(j+1<n) if(a[j+1]<a[j]) ++j;
    }
}

void urca(int k)
{
    while(k>1&&a[k]<a[k>>1])
    {
        swap(a[k],a[k>>1]);
        swap(poz1[k],poz1[k>>1]);
        swap(poz[poz1[k]],poz[poz1[k>>1]]);
        k>>=1;
    }
}

void sterge(int k)
{
    swap(a[k],a[n]);
    poz[poz1[n]]=k;
    --n;
    if(k>1) {if(a[k]<a[k>>1]) urca(k);}
    else coboara(k);
}

void adauga(int x)
{
    a[++n]=x;
    poz[n]=n;
    poz1[n]=n;
    urca(n);
}

int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    int t,o,p;
    scanf("%d",&t);
    while(t)
    {
        --t;
        scanf("%d",&o);
        if(o==1)
        {
            scanf("%d",&p);
            adauga(p);
        }
        if(o==2)
        {
            scanf("%d",&p);
            sterge(poz[p]);
        }
        if(o==3)
        {
            printf("%d\n",a[1]);
        }
    }
    return 0;
}