import java.util.;
/
* @author yw~
* @version 1.0
/
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int b=in.nextInt();
int []a=new int [n];
for(int i=0;i[HTML_REMOVED]= 0; i–) {
adjustHeap(a, i, a.length);
}
//交换堆顶和最后一位,即将大根堆的最大元素放入到最后,再将剩余元素排序为大根堆,再交换,完成排序
for (int j = a.length - 1; j > 0; j--) {
int temp = a[j];
a[j] = a[0];
a[0] = temp;
adjustHeap(a, 0, j);
}
//Arrays.stream(a).forEach(System.out::print);
//Arrays.stream(a).forEach(e -> System.out.print(e + " "));
for(int i=0;i<b;i++){
System.out.print(a[i]+" ");
}
}
//堆排序
/**
* @param a 待排序的数组
* @param i 非叶子节点的下标
* @param length 待排序的剩余数组长度
*/
public static void adjustHeap(int[] a, int i, int length) {
//保存这个非叶子节点值
int temp = a[i];
//首先获取到该非叶子节点的左、右子节点,
for (int k = 2 * i + 1; k < length; k = 2 * k + 1) {
//判断左、右子节点大小,注意判断符合的情况,右子节点是否超过了设定数组长度
if (k + 1 < length && a[k] < a[k + 1]) {
k++;
}
if (a[k] > temp) {
//交换位置
a[i] = a[k];
//该位置的i转移到交换位置
i = k;
} else {
break;
}
}
//循环结束,将交换位置赋值
a[i] = temp;
}
}