Pagini recente » Cod sursa (job #1318769) | Cod sursa (job #1834805) | Cod sursa (job #970205) | Cod sursa (job #1549323) | Cod sursa (job #557428)
Cod sursa(job #557428)
#include <ctime>
#include <fstream>
#include <cstdlib>
#include <iterator>
#include <algorithm>
#define N_MAX 3000011
using namespace std;
int v[N_MAX];
inline int MedianOf3( int x, int y, int z )
{
int w[]={ x, y, z }, i, j;
for( i=0; i <= 1; ++i )
for( j=i+1; j <= 2; ++j )
if( w[i] > w[j] )
swap( w[i], w[j] );
return w[1];
}
inline void FindKth( int left, int right, int k )
{
if( left < right )
{
int xRandom=rand()%(right-left+1)+left;
swap( v[(left+right)/2], v[xRandom] );
int pValue=MedianOf3( v[left], v[(left+right)/2], v[right] ), lleft, rright;
for( lleft=left-1, rright=right+1; ; )
{
for( ++lleft; pValue > v[lleft]; ++lleft );
for( --rright; pValue < v[rright]; --rright );
if( lleft > rright )
break;
swap( v[lleft], v[rright] );
}
if( rright >= k )
FindKth( left, rright, k );
else FindKth( rright+1, right, k );
}
}
int main()
{
srand( time( NULL ) );
int N, K;
ifstream in( "sdo.in" );
in>>N>>K;
copy( istream_iterator<int>(in), istream_iterator<int>(), v+1 );
FindKth( 1, N, K );
ofstream out( "sdo.out" );
out<<v[K]<<'\n';
}