#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int hp[N];
int idx;
void Down(int u)
{
int t = u;
if (2 * u <= idx && hp[t] > hp[2 * u])
{
t = 2 * u;
}
if (2 * u + 1 <= idx && hp[t] > hp[2 * u + 1])
{
t = 2 * u + 1;
}
if (t != u)
{
swap(hp[t], hp[u]);
Down(t);
}
}
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <=n; i++)
{
cin>>hp[i];//输入n个数,完全二叉树结构
}
idx=n;
for (int i = n / 2; i; i--)
{
Down(i);//堆初始化
}
while (m--
{
printf("%d ", hp[1]);
hp[1] = hp[idx--];
Down(1);
}
cout << endl;
return 0;
}