Cod sursa(job #280991)

Utilizator igsifvevc avb igsi Data 13 martie 2009 18:24:03
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<fstream.h>

#define xx 200001

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

int h[xx],n,p[xx],pi[xx],nr;

inline void schimba(int i,int j)
{
       int aux;
       aux=pi[p[i]]; pi[p[i]]=pi[p[j]]; pi[p[j]]=aux;
       aux=p[i]; p[i]=p[j]; p[j]=aux;
       aux=h[i]; h[i]=h[j]; h[j]=aux;
}
       
void jos(int i)
{
     int k=-1;
     if(p[2*i] && p[2*i+1])
       k=(h[2*i]<h[2*i+1] ? 2*i : 2*i+1);
     else
       if(p[2*i] && !p[2*i+1])
          k=2*i;
       else
          if(!p[2*i] && p[2*i+1])
             k=2*i+1;
     
     if(k!=-1 && h[i]>h[k])
     {
       schimba(i,k);
       jos(k);
     }
}

void sus(int i)
{
     int k=i/2;
     if(k && h[k]>h[i])
     {
          schimba(i,k);
          sus(k);
     }
}

void sterge(int i)
{
     int k=p[n];
     
      schimba(pi[i],n);
         
     p[pi[i]]=0;
     h[pi[i]]=0;
     pi[i]=0;
     n--;
     
     jos(pi[k]);
}

int main()
{
    int op,i,x;
    fin>>nr;
    
    for(i=1;i<=nr;i++)
    {
         fin>>op;
         if(op==1)
         {
             fin>>x;
             pi[++n]=n;
             p[n]=n;
             h[n]=x;
             sus(n);
         }
         else
            if(op==2)
            {
                fin>>x;
                sterge(x);
            }
            else
              fout<<h[1]<<'\n';
    }
    
    fout.close();
    return 0;
}