Cod sursa(job #1032629)

Utilizator macajouMaca George macajou Data 15 noiembrie 2013 20:00:10
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#define nmax 200010
#define inf 1<<30

using namespace std;

int a[nmax],b[nmax],poz[nmax],k,nro,n;

void heap(int nod)
{
    if(a[2*nod]==-1)
       return;
    if(a[2*nod]<a[nod])
       {
           if(a[2*nod+1]<a[2*nod] && a[2*nod+1]!=-1)
              {
                  swap(a[nod],a[2*nod+1]);
                  swap(poz[b[nod]],poz[b[2*nod+1]]);
                  swap(b[nod],b[2*nod+1]);
                  heap(2*nod+1);
              }
           else
               {
                   swap(a[nod],a[nod*2]);
                   swap(poz[b[nod]],poz[b[2*nod]]);
                   swap(b[nod],b[2*nod]);
                   heap(2*nod);
               }
       }
    heap(nod-1);
}

void heap1(int nod)
{
    if(a[2*nod]==-1)
       return;
    if(a[2*nod]<a[nod])
       {
           if(a[2*nod+1]<a[2*nod])
              {
                  swap(a[nod],a[2*nod+1]);
                  swap(poz[b[nod]],poz[b[2*nod+1]]);
                  swap(b[nod],b[2*nod+1]);
                  heap(2*nod+1);
              }
           else
               {
                   swap(a[nod],a[nod*2]);
                   swap(poz[b[nod]],poz[b[2*nod]]);
                   swap(b[nod],b[2*nod]);
                   heap(2*nod);
               }
       }
}
void sterge(int x)
{
    int p=poz[x];
    a[p]=a[n];
    heap1(p);
    a[n--]=-1;
}
void inserare(int x)
{
    a[++n]=x;
    b[n]=++k;
    poz[k]=n;
    if(n>1)
       heap(n/2);
}

int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);

    int i,op,x;
    memset(a,-1,sizeof(a));
    scanf("%d",&nro);
    for(i=1;i<=nro;i++)
        {
            scanf("%d",&op);
            if(op!=3)
               {
                   scanf("%d",&x);
                   if(op==1)
                      inserare(x);
                   if(op==2)
                       sterge(x);
               }
            else printf("%d\n",a[1]);
        }

    return 0;
}