#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
// void print(vector<int> &v)
// {
// for (auto el : v)
// {
// cout << el << " ";
// }
// cout << endl;
// }
// void print_p(vector<int> &v, int start, int end, int p)
// {
// for (int i = 0; i < start; i++)
// {
// cout << v[i] << " ";
// }
// cout << "[ ";
// for (int i = start; i <= end; i++)
// {
// if (i == p)
// {
// cout << "{" << v[i] << "} ";
// }
// else
// {
// cout << v[i] << " ";
// }
// }
// cout << " ] ";
// for (int i = end + 1; i < v.size(); i++)
// {
// cout << v[i] << " ";
// }
// cout << endl;
// }
// void print(vector<int> &v, int l, int r)
// {
// for (auto el : v)
// {
// cout << el << " ";
// }
// cout << "left: " << l << " right: " << r << endl;
// }
// void print_v(vector<int> &v, int start, int end, int k)
// {
// for (int i = 0; i < start; i++)
// {
// cout << v[i] << " ";
// }
// cout << "[ ";
// for (int i = start; i <= end; i++)
// {
// cout << v[i] << " ";
// }
// cout << "] ";
// for (int i = end + 1; i < v.size(); i++)
// {
// cout << v[i] << " ";
// }
// cout << " | k=" << k << endl;
// }
// int partition(vector<int> &v, int start, int end, int pivot)
// {
// // cout << "partition start => ";
// // print_v(v, start, end, pivot);
// int p = v[pivot];
// swap(v[end], v[pivot]);
// // print(v);
// int left = start;
// int right = end - 1;
// while (left < right)
// {
// if (v[left] > p)
// {
// swap(v[left], v[right]);
// right--;
// }
// else
// {
// left++;
// }
// // print(v, left, right);
// }
// swap(v[left + 1], v[end]);
// // print(v, left, right);
// // vector<int> larger;
// // int equalCount = 0;
// // cout << "partition end" << endl;
// return left;
// }
int partition2(vector<int> &v, int start, int end, int pivot)
{
int p = v[pivot];
int l = start;
int r = end;
// cout << "pivot " << v[pivot] << endl;
while (true)
{
while (l < v.size() && v[l] <= p)
{
l++;
}
while (r >= 0 && v[r] > p)
{
r--;
}
// cout << "left: " << l << " right: " << r << endl;
if (l >= r)
{
swap(v[pivot], v[r]);
return r;
}
// cout << "Swapping " << v[l] << " with " << v[r] << endl;
swap(v[l], v[r]);
}
}
int quickselect(vector<int> &v, int start, int end, int k)
{
// if (n == 1)
// {
// return v[0];
// }
// auto pivot = 4;
// print(v);
// cout << "pivot: " << v[pivot] << endl;
// auto p = partition(v, pivot);
// print(v);
// cout << "pivot " << v[p] << endl;
// return 0;
if (start == end)
{
return start;
}
// print_v(v, start, end, k);
int pivot = start;
// cout << "pivot=" << pivot << endl;
int new_pivot = partition2(v, start, end, pivot);
// cout << "new_pivot=" << new_pivot << endl;
// print_p(v, start, end, new_pivot);
// print_v(v, start, end, k);
// cout << endl;
if (new_pivot == k)
{
return new_pivot;
}
else if (new_pivot > k)
{
return quickselect(v, start, new_pivot - 1, k);
}
else
{
return quickselect(v, new_pivot + 1, end, k);
}
}
int main()
{
ifstream in("sdo.in");
ofstream out("sdo.out");
int n, k;
in >> n >> k;
vector<int> v;
v.resize(n);
for (int i = 0; i < n; i++)
{
in >> v[i];
}
int p = quickselect(v, 0, n - 1, k - 1);
out << v[p];
// print(v);
// cout << v[p];
// vector<int> v = {2, 1, 3, 4, 5, 6};
// print(v);
// auto p = partition2(v, 0, v.size() - 1, 0);
// print(v);
// cout << v[p];
return 0;
}