Pagini recente » Cod sursa (job #2806031) | Cod sursa (job #1638764) | Cod sursa (job #1856219) | Cod sursa (job #3203325) | Cod sursa (job #394068)
Cod sursa(job #394068)
/*
* File: main.cpp
* Author: virtualdemon
*
* Created on February 9, 2010, 7:25 PM
*/
#include <fstream>
#include <iterator>
#define Nmax 3000001
/*
*
*/
using namespace std;
int v[Nmax];
inline void swap( int x, int y )
{
v[x]+=v[y];
v[y]=v[x]-v[y];
v[x]-=v[y];
}
inline int medianof3( int a, int b, int c )
{
if( a > b )
swap( a, b );
if( a > c )
swap( a, c );
if( b > c )
swap( b, c );
swap( b, c-1 );
return v[c-1];
}
inline int Partition( int left, int right, int pValue )
{
int leftPtr=left, rightPtr=right;
while( true )
{
while( v[++leftPtr] > pValue );
while( v[--rightPtr] < pValue );
if( leftPtr >= rightPtr )
break;
swap( leftPtr, rightPtr );
}
swap( left, right-1 );
return leftPtr;
}
inline int Select( int left, int right, int i )
{
if( left == right )
return v[left];
int middle=left+(right-left)/2;
int q=Partition( left, right, medianof3( left, middle-1, right-1 ) );
int k=q-left+1;
if( i == k )
return v[q];
if( i < k )
return Select( left, q-1, i );
else return Select( q+1, right, i-k );
}
int main( void )
{
int n, k;
ifstream in("sdo.in");
in>>n>>k;
copy( istream_iterator<int>(in), istream_iterator<int>(), v );
ofstream out("sdo.out");
out<<Select( 0, n, k );
return 0;
}