#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
void sort(vector<int>& a, int left, int right) {
int i, j, temp, base;
base = a[left];
if (left >= right) return; //分割点一边剩一个数或者没有数的时候直接返回,也可以通过left>right
i = left; //来判断,相当于当left=right时什么都不执行,再来一遍后left>right
j = right; //还是一样的结果。不过基于人的思考方式和尽量减少步骤可以直接用≥判断
while (i < j) {
while (i < j && a[j] >= base) { //判断条件必须都加等于或者其中一个等于,否则出现多个
j--; //相同数据时可能会卡住动不了无限循环
}
while (i < j && a[i] <= base) {
i++;
}
temp = a[i]; //交换操作
a[i] = a[j];
a[j] = temp;
}
a[left] = a[i]; //基准位置和分割点交换
a[i] = base;
sort(a, left, i - 1);
sort(a, i + 1, right);
}
int main() {
int n, k;
cin >> n >> k;
vector<int> num(n);
for (int i = 0; i < n; i++) {
cin >> num[i];
}
sort(num, 0, num.size() - 1);
for (int x : num) {
if (!k) break;
cout << x << ' ';
k--;
}
}
// 64 位输出请用 printf("%lld")