#include<stdio.h>
#define INF 0x3f3f3f3f
int n, m, a[15];
int size;
int delete_max()//和插入思路很像,找到儿子比自己大的放在自己的位置,自己继续往下找,直到儿子都比自己小的时候,自己就坐定了
{
int p, c, max, t;
max = a[1]; //大顶堆, 堆顶元素是最大的
t = a[size--]; //最后一个元素得补位, 取出来, size--
for(p = 1; 2*p <= size; p = c)
{
c = 2*p; //c是p的儿子
if(c != size && a[c] < a[c+1]) //找左右儿子中较大者
c = c + 1;
if(t >= a[c]) break; //儿子比自己小, 停止
else
a[p] = a[c]; //儿子比自己大, 换
}
a[p] = t; //循环结束后,把t赋值给没有值的p
return max; //返回堆顶元素值(最大值)
}
void adjust(int x) //调整堆 思路与删除,插入差不多
{
int max, c;
max = a[x]; //让a[x]位置的值应该最大
c = 2*x; //x的儿子
if(c > size) return ; //递归到儿子是空节点
if(c != size && a[c] < a[c+1])
c =c + 1; //找较大的儿子
if(max >= a[c]) return ; //a[x]比儿子大,成为最大的,调整完成
else //调整部分
{
a[x] = a[c]; //把最大的儿子的值给它
a[c] = max; //它的值给儿子
adjust(c); //对儿子进行调整
}
}
void creat_heap(int m)//直接插入建堆效率不高, 先建小堆 调整成大堆
{
int i;
for(i = m/2; i >= 1; i--) //从最后一个元素的父亲开始向上调整堆
{
adjust(i);
}
}
int main()
{
int i, j, t, num;
scanf("%d%d", &n, &m);
a[0] = INF;
for(i = 1; i <= n; i++)
{
if(i <= m)
scanf("%d", &a[i]); //数组存上m个数
else
{
scanf("%d", &num); //数组空间有限,判断num是否比数组里的数大,
//大就用num替换掉数组里比他小的,否则不要num
t = 1;
for(j = 1; j <= m; j++)
{
if(a[t] > a[j]) //a[t]变成数组中最小的数
t = j;
}
if(a[t] < num) a[t] = num;
}
}
size = m;
creat_heap(m); //建堆
for(i = 0; i < m; i++)
{
printf("%d", delete_max()); //从堆中取堆顶元素,输出
if(i == m-1) printf("\n");
else printf(" ");
}
return 0;
}
/*
//插入函数
void insert_max(int x);
{
int i;
for(i = ++size; x > a[i/2]; i = i/2)//在最后一个位置插入一个数,如果这个数比它的父亲大,它的值去父亲的位置
{
a[i] = a[i/2]; //父亲的值到它的位置
}
a[i] = x; //跑到它的父亲比它大,
}
*/