Cod sursa(job #274375)

Utilizator alecmanAchim Ioan Alexandru alecman Data 9 martie 2009 17:48:48
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.23 kb
#include<cstdio>
#include<algorithm>

using namespace std;

#define INPUT "heapuri.in"
#define OUTPUT "heapuri.out"
#define NMAX 200001
#define INFI 2000000000

FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");

long Heap[ NMAX ], Enter[ NMAX ], PHeap[ NMAX ];
long Nr, Poz;

inline void twist(long &_A, long &_B)
{
  _A = _A + _B;
  _B = _A - _B;
  _A = _A - _B;
}

void AddHeap(long _X)
{
  ++Poz, ++Nr;

  Heap[ Poz ] = _X;
  Enter[ Poz ] = Nr;
  PHeap[ Nr ] = Poz;

  long p = Poz;

  while( p / 2 > 0 && Heap[ p/2 ] > Heap[ p ])
  {
    swap(Heap[ p/2 ], Heap[ p ]);
    swap(Enter[ p/2 ], Enter[ p ]);
    swap(PHeap[ Enter[ p/2 ] ], PHeap[ Enter[ p ] ]);
    p /= 2;
  }

  for(long i = 1; i <= Poz; ++i)
    fprintf(stderr, "%ld ", Heap[ i ]);
  fprintf(stderr, "\n");
}

void ExtractHeap(long _X)
{
  long pEx = PHeap[ _X ];

  Heap[ pEx ] = Heap[ Poz ];
  Heap[ Poz ] = INFI;
  Enter[ pEx ] = Enter[ Poz ];
  Enter[ Poz ] = -1;
  PHeap[ Enter[ pEx ] ] = pEx;
  PHeap[ _X ] = -1;

  --Poz;

  long p = pEx;

  while( p * 2 <= Poz )
  {
    if( p * 2 + 1 <= Poz)
    {
      if(Heap[ p*2 ] < Heap[ p*2 + 1 ] && Heap[ p ] > Heap[ p*2 ])
      {
        swap(Heap[ p*2 ], Heap[ p ]);
        swap(Enter[ p*2 ], Enter[ p ]);
        swap(PHeap[ Enter[ p*2 ] ], PHeap[ Enter[ p ] ]);
        p *= 2;
      }
      else
      if(Heap[ p*2 ] > Heap[ p*2 + 1 ] && Heap[ p ] > Heap[ p*2 + 1 ])
      {
        swap(Heap[ p*2 +1 ], Heap[ p ]);
        swap(Enter[ p*2 +1 ], Enter[ p ]);
        swap(PHeap[ Enter[ p*2 +1 ] ], PHeap[ Enter[ p ] ]);
        p = p*2 + 1;
      }
      else break;
    }
    else
    {
      if(Heap[ p ] > Heap[ p * 2 ])
      {
        swap(Heap[ p*2 ], Heap[ p ]);
        swap(Enter[ p*2 ], Enter[ p ]);
        swap(PHeap[ Enter[ p*2 ] ], PHeap[ Enter[ p ] ]);
        p *= 2;
      }
      else break;
    }
  }
}

int main()
{
  long N, X;
  int Code;
  Nr = 0;
  Poz = 0;

  fscanf(fin, "%ld", &N);

  for(long i = 0; i < N; ++i)
  {
    fscanf(fin, "%d", &Code);
    
    if(Code == 1)
    {
      fscanf(fin, "%ld", &X);
      AddHeap(X);
    }
    else
    if(Code == 2)
    {
      fscanf(fin, "%ld", &X);
      ExtractHeap(X);
    }
    else
      fprintf(fout, "%ld\n", Heap[ 1 ]);
  }

  fclose(fin);
  fclose(fout);

  return 0;
}