Pagini recente » Cod sursa (job #351049) | Cod sursa (job #422433) | Rating Darius Tat (eZ_tAt) | Borderou de evaluare (job #155280) | Cod sursa (job #1246520)
#include <fstream>
#include <cstdlib>
using namespace std;
#define fileIn "sdo.in"
#define fileOut "sdo.out"
#define maxN 3000100
int v[maxN];
int getPivot( int lo, int hi )
{
int index = lo + ( rand() % ( hi - lo + 1 ) );
int pivot = v[index];
int dummy;
v[index] = v[hi];
v[hi] = pivot;
index = lo;
for ( int i = lo; i < hi; ++i )
{
if ( v[i] < pivot )
{
if ( i != index )
{
dummy = v[i];
v[i] = v[index];
v[index++] = dummy;
}
else
++index;
}
}
return index;
}
int quickSelect( int lo, int hi, int k )
{
while ( true )
{
if ( lo >= hi )
return v[lo];
int sorted = getPivot( lo, hi );
int localSorted = sorted - lo + 1;
if ( localSorted < k )
{
lo = sorted + 1;
k = k - localSorted;
}
else
{
if ( localSorted > k )
{
hi = sorted - 1;
}
else
return v[sorted];
}
}
}
int main()
{
srand( 312314 * 3 / 2 );
ifstream sIn ( fileIn );
ofstream sOut( fileOut );
int n, k;
sIn >> n >> k;
for ( int i = 1; i <= n; ++i )
sIn >> v[i];
sOut << quickSelect( 1, n, k ) << '\n';
return 0;
}