Cod sursa(job #267389)

Utilizator pascu_iulianPascu Iulian pascu_iulian Data 27 februarie 2009 09:37:19
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
// (min-)Heapuri

#include <cstdio>


int a[200000],p[200000],H[200000],cnt=0,lv=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) // cand subarborii sunt heapuri
{
     int l,r,min;
     do
     {
         l = 2*i ;  //   Stanga
         r = 2*i +1 ;//   Dreapta 
         if ( l<= dim_heap &&  a[h[l]]< A[h[i]] )
                  min= l;
          else    min= i;
         if ( r<= dim_heap &&  A[h[r]]< A[h[i]] )
              min= r;
         if ( min!= i )
            swap (i,min);
            
         i= min;
     } while (i!= min);
}

void up ( int i) // 
{
 if (i>1) 
 {
     int pr= i/2,aux;
     while ( A[h[i]] < A[h[pr]] )
     {
           swap (i,pr);
           pr= i/2;
     }
 }//end.if
}

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

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

int main()
{
    freopen ("heapuri.in","r",stdin);
 //   freopen ("heapuri.out","w",stdout);
    int N, i, option,k,z=0;
    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;
}