Cod sursa(job #331496)

Utilizator IoannaPandele Ioana Ioanna Data 14 iulie 2009 11:31:03
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include<stdio.h>
#include<string.h>
#define nmax 200010
long n,h[nmax],v[nmax],poz[nmax];

void read()
{
scanf("%ld",&n);
}

void ath()
{
long k,aux;
if (h[0]==0)
   {
    h[1]=v[0];
    poz[v[0]]=1;
    h[0]++;
    }
else {
      h[++h[0]]=v[0];
      poz[v[0]]=h[0];
      k=h[0];
      while (v[h[k/2]]>v[v[0]] && k/2!=0)
            {
             aux=poz[h[k]];
             poz[h[k]]=poz[h[k/2]];
             poz[h[k/2]]=aux;
             aux=h[k];
             h[k]=h[k/2];
             h[k/2]=aux;
             k=k/2;
            }
     }
}


void elim()
{
long p,k,f,aux,el;

p=k=poz[v[v[0]]];
h[k]=h[h[0]];
el=h[k];
poz[v[v[0]]]=-1;
poz[h[k]]=k;
h[0]--;
while (k>1 && v[h[k]]<v[h[k/2]])
      {
       aux=poz[h[k]];
       poz[h[k]]=poz[h[k/2]];
       poz[h[k/2]]=aux;
       aux=h[k];
       h[k]=h[k/2];
       h[k/2]=aux;
       k=k/2;
      }
do
{
f=0;
if (2*k<=h[0])
   {
    f=v[h[2*k]];
    p=2*k;
    if (2*k+1<=h[0])
        if (f>v[h[2*k+1]])
           {
            f=v[h[2*k+1]];
            p=2*k+1;
           }
   }
if (f)
   {
    if (v[h[k]]>f)
       {
        aux=poz[h[p]];
        poz[h[p]]=poz[h[k]];
        poz[h[k]]=aux;
        aux=h[k];
        h[k]=h[p];
        h[p]=aux;
        k=p;
       }
    else f=0;
   }
}
while(f);

}

void op(long cod)
{
switch (cod)
       {
        case 1:{ath();break;}
        case 2:{elim();v[0]--;break;}
        case 3:{printf("%ld\n",v[h[1]]);break;}
       }
}


void rez()
{
long i;
long cod;
for (i=1;i<=n;i++)
    {
     scanf("%ld",&cod);
     if (cod!=3)
         scanf("%ld",&v[++v[0]]);
     op(cod);
    }
}

int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
read();
rez();
return 0;
}