Cod sursa(job #1073927)

Utilizator nod_softwareBudisteanu Ionut Alexandru nod_software Data 6 ianuarie 2014 22:08:35
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.24 kb
#include <cstdio>

using namespace std;

class THeap
{
   public:

       int InsertElement(int iNumber);
       int DeleteElement(int iNumber);
       int GetMinim();

       THeap();//Constructor
   private:

       void HeapUp(int i);
       void HeapDown(int iElement);
       void Exchange(int iX, int iY);

       int m_iNr;
       int m_iQ;
   protected:
       int m_vPoz[200002];
       int m_vHeap[200002];
       int m_vValueArray[200002];
};

//---------------------------------------------------------------
THeap::THeap()
{
   this->m_iNr=0;
}
//---------------------------------------------------------------
int THeap::InsertElement(int iNumber)
{
   m_vValueArray[++m_iQ]=iNumber;
   m_vHeap[++m_iNr]=m_iQ;
   m_vPoz[m_iQ]=m_iNr;
   HeapUp(m_iNr);

   return 1;
}
//---------------------------------------------------------------
int THeap::DeleteElement(int iNumber)
{
   int iPosition;

   iPosition=m_vPoz[iNumber];
   Exchange(m_vPoz[iNumber],m_iNr);
   m_iNr--;
   HeapDown(iPosition);

   return 1;
}
//---------------------------------------------------------------
int THeap::GetMinim()
{
   return m_vValueArray[m_vHeap[1]];
}
//---------------------------------------------------------------
void THeap::Exchange(int iX, int iY)
{
   int iAux;

   iAux=m_vHeap[iX];
   m_vHeap[iX]=m_vHeap[iY];
   m_vHeap[iY]=iAux;

   m_vPoz[m_vHeap[iX]]=iX;
   m_vPoz[m_vHeap[iY]]=iY;
}
//---------------------------------------------------------------
void THeap::HeapUp(int i)
{
   int iElement;
   if(i<=1) return;

   iElement=i/2;
   if(m_vValueArray[m_vHeap[i]]<m_vValueArray[m_vHeap[iElement]])
   {
      Exchange(i,iElement);
      HeapUp(iElement);
   }
}
//---------------------------------------------------------------
void THeap::HeapDown(int iElement)
{
   int iLeft=iElement*2;
   int iRight=iElement*2+1;

   if (iLeft<=m_iNr)
   {
      int p=iLeft;

      if (iRight<=m_iNr && m_vValueArray[m_vHeap[iRight]]<m_vValueArray[m_vHeap[iLeft]])
         p=iRight;

      if (m_vValueArray[m_vHeap[p]]<m_vValueArray[m_vHeap[iElement]])
      {
         Exchange(iElement,p);
         HeapDown(p);
      }
   }
}
//---------------------------------------------------------------
//---------------------------------------------------------------
//---------------------------------------------------------------

//---------------------------------------------------------------
void ReadData()
{
    FILE * fIn = fopen("heapuri.in","r");
    FILE * fOut = fopen("heapuri.out","w");

    int iN,iCase, iNumber;

    THeap * objHeap;
    objHeap = new THeap();

    fscanf(fIn,"%d",&iN);

    for (int i=0;i<iN; i++)
    {
       fscanf(fIn,"%d",&iCase);
       if (iCase==1)
       {
          fscanf(fIn,"%d",&iNumber);
          objHeap->InsertElement(iNumber);

       } else
       if(iCase==2)
       {
          fscanf(fIn,"%d",&iNumber);
          objHeap->DeleteElement(iNumber);
       } else
       if(iCase==3)
       {
          fprintf(fOut,"%d\n",objHeap->GetMinim());
       }
    }

    fclose(fIn);
    fclose(fOut);
}
//---------------------------------------------------------------
int main()
{
    ReadData();

    return 0;
}