Pagini recente » Cod sursa (job #3241522) | Cod sursa (job #185221) | Cod sursa (job #924994) | Cod sursa (job #115606) | Cod sursa (job #1073927)
#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;
}