#include<cstdio>#include<algorithm>
using namespace std;/*
堆的关系 前提:根下标为0, 共N个元素;
i的左孩子:2i + 1;
i的右孩子:2i + 2;
i的父亲:( i - 1 ) / 2;
最后一个非叶节点 ( N - 2 ) / 2, 即末尾结点的父亲;
*/voidAdjustDown(int A[],int k,int N ){int top = A[k];for(int i =2* k +1; i < N; i =2* i +1){if( A[i]< A[ i +1]&& i +1< N )++i;if( top < A[i]){
A[k]= A[i];
k = i;}elsebreak;}
A[k]= top;}voidCreateHeap(int A[],int N ){for(int i =( N -2)/2; i >=0;--i )AdjustDown( A, i, N );}voidHeapSortOutput(int A[],int N ){CreateHeap( A, N );for(int i = N -1; i >=0;--i ){printf("%d%s", A[0], i ?" ":"\n");swap( A[0], A[i]);AdjustDown( A,0, i );}}voidAdjustUp(int A[],int k ){int top = A[k];for(int i =( k -1)/2; i >=0&& A[i]< A[k]; i =( i -1)/2){
A[k]= A[i];
k = i;}
A[k]= top;}voidInsert(int A[],int K,int&N ){
A[N]= K;AdjustUp( A, N++);}intmain(){int N, K;scanf("%d %d",&N,&K);int A[N +1];for(int i =0; i < N;++i)scanf("%d",&A[i]);HeapSortOutput( A, N );Insert( A, K, N );HeapSortOutput( A, N );}