#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#define swap(a, b) do { \
(a) = (a) ^ (b); \
(b) = (b) ^ (a); \
(a) = (a) ^ (b); \
} while(0)
void read_input(char * file, int ** a, int * n, int * k) {
FILE * f;
int i;
f = fopen(file, "r");
assert(f);
fscanf(f, "%d %d", n, k);
*a = (int *) malloc(*n * sizeof(int));
for (i = 0; i < *n; ++i)
fscanf(f, "%d", (*a) + i);
fclose(f);
}
int partition(int *a, int i, int j) {
int x;
x = a[i];
i--;
j++;
for (;;) {
do
i++;
while (a[i] < x);
do
j--;
while (a[j] > x);
if (i < j)
swap(a[i], a[j]);
else
return j;
}
}
int find_kth(int *a, int i, int j, int k) {
int q, r;
if (i == j)
return a[i];
q = partition(a, i, j);
r = q - i + 1;
if (k <= r)
return find_kth(a, i, q, k);
else
return find_kth(a, q + 1, j, k - r);
}
int main(int argc, char * argv[]) {
int n, k;
int * a;
// if (argc != 2) {
// printf("Usage:%s file_in\n", argv[0]);
// exit(EXIT_FAILURE);
// }
read_input("sdo.in", &a, &n, &k);
//printf("%dth min is %d\n", k, find_kth(a, 0, n-1, k));
FILE * f;
f = fopen("sdo.out", "w");
fprintf(f, "%d", find_kth(a, 0, n-1, k));
fclose(f);
return 0;
}