Pagini recente » Cod sursa (job #3261376) | Cod sursa (job #1022066) | Cod sursa (job #746272) | Cod sursa (job #1056225) | Cod sursa (job #1014834)
#include <stdio.h>
#include <fstream>
#include <ctime>
#include <cstdlib>
#include <vector>
using namespace std;
const int _iMaxLength = 3e6+1;
class TOrderStatistics
{
public:
TOrderStatistics(int iKthPosition);
~TOrderStatistics();
int AddData(int iNewValue);
void ComputeOrder(int iKthPosition);
friend ostream &operator<<(ostream &fOutput, TOrderStatistics &objElement)
{
#ifndef INFOARENA
std::vector<int>::iterator itIndex;
for (itIndex=objElement.m_vData.begin(); itIndex!=objElement.m_vData.end(); ++itIndex)
{
fOutput<<*itIndex;
}
fOutput << endl;
#endif // INFOARENA
fOutput << objElement.m_vData[objElement.iKthPosition];
return fOutput;
}
void PrintData(FILE * fOut) {fprintf(fOut,"%d",this->m_vData[this->iKthPosition]);}
private:
int Part(int li, int lf);
void Sel(int li, int lf, int k);
int iKthPosition;
protected:
vector <int> m_vData;
};
//--------------------------------------------
//--------------------------------------------
//--------------------------------------------
TOrderStatistics::TOrderStatistics(int iKthPosition)
{
this->iKthPosition=iKthPosition;
this->m_vData.clear();
}
//--------------------------------------------
TOrderStatistics::~TOrderStatistics()
{
this->m_vData.clear();
}
//--------------------------------------------
int TOrderStatistics::AddData(int iNewValue)
{
m_vData.push_back(iNewValue);
}
//--------------------------------------------
int TOrderStatistics::Part(int iLeft, int iRight)
{
int iIndex1 = iLeft-1; int iIndex2 = iRight+1;
int p = this->m_vData[iLeft];
while(1)
{
do
{
--iIndex2;
} while(p < this->m_vData[iIndex2]);
do
{
++iIndex1;
} while(this->m_vData[iIndex1] < p);
if(iIndex1 < iIndex2) swap(this->m_vData[iIndex1], this->m_vData[iIndex2]);
else return iIndex2;
}
return 0;
}
//--------------------------------------------
void TOrderStatistics::Sel(int iLeft, int iRight, int iKthPosition)
{
if(iLeft == iRight) return;
int iSol = this->Part(iLeft, iRight);
int iPos = iSol-iLeft+1;
if(iPos >= iKthPosition) this->Sel(iLeft, iSol, iKthPosition);
else this->Sel(iSol+1, iRight, iKthPosition-iPos);
}
//--------------------------------------------
void TOrderStatistics::ComputeOrder(int iKthPosition)
{
// printf("%d",this->m_vData.size());
this->Sel(1, this->m_vData.size() , iKthPosition);
}
//--------------------------------------------
//--------------------------------------------
int ReadData(TOrderStatistics * objStatistics, int * iKthPosition)
{
FILE * fIn = fopen("sdo.in","r");
int iLength;
fscanf(fIn,"%d %d",&iLength,iKthPosition);
*iKthPosition=*iKthPosition+1;
objStatistics = new TOrderStatistics(*iKthPosition);
int iNumber;
objStatistics->AddData(0);
for(int iIndex = 0; iIndex < iLength; iIndex++)
{
fscanf(fIn,"%d",&iNumber);
objStatistics->AddData(iNumber);
}
fclose(fIn);
objStatistics->ComputeOrder(*iKthPosition);
FILE * fOut = fopen("sdo.out","w");
objStatistics->PrintData(fOut);
fclose(fOut);
//ofstream fOut ("sdo.out");
//fOut << objStatistics << "\n";
return 1;
}
//--------------------------------------------
int main()
{
TOrderStatistics * objStatistics;
int iKthPosition;
ReadData(objStatistics,&iKthPosition);
}