Cod sursa(job #260157)

Utilizator pascu_iulianPascu Iulian pascu_iulian Data 16 februarie 2009 18:34:22
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
// (min-)Heapuri

#include <cstdio>
//#include <conio.h> 

int A[200000],dim_heap;
int v[200000],lv=0;

void sift ( 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[l]< A[i] )
                  min= l;
          else    min= i;
         if ( r<= dim_heap &&  A[r]< A[i] )
              min= r;
         if ( min!= i )
         { 
           int aux= A[i];
           A[i]= A[min];
           A[min]= aux;
         }
         i= min;
     } while (i!= min);
}

void percolate ( int i) // 
{
     int aux= A[i],pr= i/2;
     while ( aux< A[pr] )
     {
           A[i]= A[pr];
           i= pr;
           pr= i/2;
     }
     A[i]= aux;
}

void insert ( int k)
{
     A[++dim_heap]= k;
     percolate(dim_heap);
}    

int pozitie (int k)
{
    for(int i= 1; i<= dim_heap; ++i)
            if( k== A[i] ) return i;
    return 0;
}
  
void cut (int i)
{if (i) {
     A[i]= A[dim_heap];
     --dim_heap;
     int pr= i/2;
     if( i> 1  &&  A[i]> A[pr] )
         percolate (i);
     else
         sift (i);
}}

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);
              insert(k);
              v[++lv]=k;
              break;
              }
         case 2:{
              scanf("%d", &k);
              cut( pozitie(v[k]) );
              break;
              }
         case 3:{
              printf("%d\n", A[1] );
              break;
              }
         }
    }
//    getch();
    fclose(stdout);
    return 0;
}