#include <stdio.h>
#include <stdlib.h>
void CopyArray(int B[], int iBegin, int iEnd, int A[])
{
while (iBegin < iEnd)
{
A[iBegin] = B[iBegin];
iBegin++;
}
}
void TopDownMerge(int A[], int iBegin, int iMiddle, int iEnd, int B[])
{
int i0 = iBegin, i1 = iMiddle, j;
// While there are elements in the left or right runs
for (j = iBegin; j < iEnd; j++) {
// If left run head exists and is <= existing right run head.
if (i0 < iMiddle && (i1 >= iEnd || A[i0] <= A[i1]))
B[j] = A[i0++]; // Increment i0 after using it as an index.
else
B[j] = A[i1++]; // Increment i1 after using it as an index.
}
}
void TopDownSplitMerge(int A[], int iBegin, int iEnd, int B[])
{
if (iEnd - iBegin < 2) // if run size == 1
return; // consider it sorted
// recursively split runs into two halves until run size == 1,
// then merge them and return back up the call chain
int iMiddle = (iEnd + iBegin) / 2; // iMiddle = mid point
TopDownSplitMerge(A, iBegin, iMiddle, B); // split / merge left half
TopDownSplitMerge(A, iMiddle, iEnd, B); // split / merge right half
TopDownMerge(A, iBegin, iMiddle, iEnd, B); // merge the two half runs
CopyArray(B, iBegin, iEnd, A); // copy the merged runs back to A
}
void TopDownMergeSort(int A[],int B[],int n)
{
TopDownSplitMerge(A, 0, n, B);
return;
}
int main()
{
FILE *IN = fopen("sdo.in", "r");
FILE *OUT = fopen("sdo.out","w+");
int V[100], n,i,C[100],k;
fscanf(IN,"%d %d",&n,&k);
for (i=0;i<n;i++)
fscanf(IN,"%d",&V[i]);
/*printf("n:");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
printf("V[%d]:", i);
scanf("%d", &V[i]);
}*/
TopDownMergeSort(V, C, n);
fprintf(OUT,"%d",C[k-1]);
return 0;
}