Pagini recente » Istoria paginii utilizator/tiut_cristian | Monitorul de evaluare | Cod sursa (job #2137856) | Cod sursa (job #1926564) | Cod sursa (job #1497246)
#include <bits/stdc++.h>
using namespace std;
const int Nmax = 3000000;
const int Buffsize = 4096;
char buff[Buffsize];
int pos = Buffsize;
inline char GetChar()
{
if ( pos == Buffsize )
{
fread(buff, 1, Buffsize, stdin);
pos = 0;
}
return buff[ pos++ ];
}
inline int ReadInt()
{
register int q = 0;
char c;
do
{
c = GetChar();
} while ( !isdigit(c) );
do
{
q = (10 * q) + (c - '0');
c = GetChar();
} while ( isdigit(c) );
return q;
}
int v[Nmax];
inline int xor128()
{
static int x = 123456789, y = 362436069, z = 521288629, w = 88675123;
int t = x ^ ( x >> 11 );
x = y;
y = z;
z = w;
return w = w ^ ( w >> 19 ) ^ ( t ^ ( t >> 8 ) );
}
void quickSelect(int n, int k)
{
int lo = 0, hi = n - 1, l;
do
{
int pIndex = lo + xor128() % (hi - lo + 1);
swap(v[hi], v[pIndex]);
l = lo;
for ( int i = lo; i < hi; i++ )
{
if ( v[i] < v[hi] )
swap(v[i], v[l++]);
}
swap(v[hi], v[l]);
if ( l < k )
lo = l + 1;
else if ( l > k )
hi = l - 1;
} while ( l != k );
}
int main()
{
freopen( "sdo.in", "r", stdin );
freopen( "sdo.out", "w", stdout );
int n, k;
n = ReadInt(); k = ReadInt();
for ( int i = 0; i < n; i++ )
v[i] = ReadInt();
fclose(stdin);
quickSelect( n, k - 1 );
printf("%d\n", v[k - 1]);
fclose(stdout);
return 0;
}