Cod sursa(job #689788)
#include <fstream>
#include <vector>
#include <cstdlib>
using std::vector;
inline void swap(int &a,int &b)
{
int aux = a; a = b; b = aux;
}
int nth_element(vector<int> &v,int le,int ri,int K)
{
if(ri - le > 0)
{
int p = v[le + rand() % (ri - le + 1)];
int i = le,j = ri;
do
{
while(v[i] < p) ++i;
while(v[j] > p) --j;
if(i < j)
{
swap(v[i++],v[j--]);
}
else if(i == j) rand() % 2 == 0 ? --j : ++i;
}
while(i <= j);
if(K <= j - le + 1) return nth_element(v,le,j,K);
else return nth_element(v,i,ri,K - (j - le + 1));
}
else return v[le]; //v[ri]
}
int main()
{
std::ifstream in("sdo.in");
std::ofstream out("sdo.out");
int N,K;
in >> N >> K;
vector<int> v(N);
for(vector<int>::iterator i = v.begin(); i != v.end(); ++i)
in >> *i;
out << nth_element(v,0,N - 1,K);
return 0;
}