Pagini recente » Cod sursa (job #523740) | Cod sursa (job #642414) | Cod sursa (job #2045441) | Cod sursa (job #1335564) | Cod sursa (job #394078)
Cod sursa(job #394078)
/*
* File: main.cpp
* Author: virtualdemon
*
* Created on February 9, 2010, 7:25 PM
*/
#include <ctime>
#include <vector>
#include <fstream>
#include <cstdlib>
#include <iterator>
#define Nmax 3000001
/*
*
*/
using namespace std;
vector< int > v;
inline int swap( int& x, int& y )
{
x+=y;
y=x-y;
x-=y;
}
int Partition( int left, int right, int x )
{
int leftPtr=left, rightPtr=right;
while( true )
{
while( v[++leftPtr] > x );
while( v[--rightPtr] < x );
if( leftPtr >= rightPtr )
break;
swap( v[leftPtr], v[rightPtr] );
}
swap( v[left], v[right-1] );
return leftPtr;
}
inline int Random_Partition( int left, int right )
{
int i=left+rand()%(right-left);
swap( v[right], v[i] );
return Partition( left, right, v[right-1] );
}
inline int Select( int left, int right, int k )
{
if( left == right )
return v[left];
int q=Random_Partition( left, right );
int length=q-left+1;
if( length == k )
return v[q];
if( k < length )
return Select( left, q-1, k );
else return Select( q+1, right, k-length );
}
int main( void )
{srand( time(NULL) );
int n, k;
ifstream in("sdo.in");
in>>n>>k;
copy( istream_iterator<int>(in), istream_iterator<int>(), back_inserter(v) );
ofstream out("sdo.out");
out<<Select( 0, n, k );
return 0;
}