#include <cstdio>
#include <iostream>
using namespace std;
const int N = 1000000;
/** C++ 实现大顶堆 hdu 1425
* >始终保持堆顶元素最大
*/
struct Heap {
int sz;
int a[N + 10];
Heap() { sz = 0; }
void clear() { sz = 0; }
// 取堆顶元素
int top() {
if(sz <= 0) return -1;
return a[1];
}
// 删除堆顶元素,并维护大顶堆
int pop() {
if(sz <= 0) return -1;
int rt = 1, tmp = a[sz--];
for(int x = 2 * rt; x <= sz; x *= 2) {
if(x < sz && a[x+1] > a[x]) ++x;
if(a[x] <= tmp) break;
a[rt] = a[x]; rt = x;
}
a[rt] = tmp;
return tmp;
}
// 压入元素,并维护大顶堆
void push(int v) {
int x = ++sz;
int rt = x / 2;
while(rt) {
if(a[rt] >= v) break;
a[x] = a[rt];
x = rt; rt = x / 2;
}
a[x] = v;
}
void display() {
for(int i = 1; i <= sz; ++i) cout<<a[i]<<" "; cout<<endl;
}
} heap;
int main() {
int n, m, v;
while(~scanf("%d%d", &n, &m)) {
for(int i = 1; i <= n; ++i) { scanf("%d", &v); heap.push(v); }
printf("%d", heap.top()); heap.pop();
for(int i = 1; i < m; ++i) {
printf(" %d", heap.top());
heap.pop();
}
putchar(10);
heap.clear();
}
return 0;
}