Cod sursa(job #267400)

Utilizator pascu_iulianPascu Iulian pascu_iulian Data 27 februarie 2009 10:34:05
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
// (min-)Heapuri

#include <cstdio>

int a[200100],p[200100],h[200100],dim=0,cnt=0;

void swap ( int i, int j)
{
     int aux= h[i];
     h[i]= h[j];
     h[j]= aux;
     p[h[i]]=i;
     p[h[j]]=j;
}
     

void down ( int i) 
{
     int l,r,min;
     l = 2*i ;  
     r = 2*i +1 ;
     if ( l<= dim &&  a[h[l]]< a[h[i]] )
              min= l;
      else    min= i;
      
     if ( r<= dim &&  a[h[r]]< a[h[min]] )
              min= r;
              
     if ( min!= i )
     {
              swap (i,min);
              down (min);
     }
}

void up ( int i)
{
 if (i>1 && a[h[i]] < a[h[i/2]] )
     {
           swap (i,i/2);;
           up(i/2);
     }
}

void insert ( int k)
{
     ++dim;
     h[dim]=k;
     p[k]=dim;
     up(dim);
}    

  
void cut (int k)
{
     a[k]=0;
     up (p[k]);
     h[1]=h[dim];     --dim;
     p[h[1]]=1;
     down(1);
}

int main()
{
    freopen ("heapuri.in","r",stdin);
    freopen ("heapuri.out","w",stdout);
    int N, i, option,k;
    scanf("%d", &N);
    
    for( i= 1; i<= N; ++i)
    {
         scanf("%d", &option);
         switch (option )
         {
         case 1:{
              scanf("%d", &k);
              a[++cnt]= k;
              insert (cnt);
              break;
              }
         case 2:{
              scanf("%d", &k);
              cut (k);
              break;
              }
         case 3:{
              printf("%d\n", a[h[1]] );
              break;
              }
         }
    }

    fclose(stdout);
    return 0;
}