堆排序
#include <iostream>
using namespace std;
const int maxn = 100010;
int a1[maxn];
int n,m;
void g(int lo,int len) {
int tmp = a1[lo];
int h = lo;
int k=lo*2;
while(k<=len) {
if(k+1<=len&&a1[k+1]>a1[k]) k++;
if(tmp>a1[k]) break;
a1[h] = a1[k];
h = k;
k = h*2;
}
a1[h]= tmp;
}
void f() {
for (int i=n/2;i>=1;i--) {
g(i,n);
}
for (int i=1;i<n;i++) {
swap(a1[1],a1[n+1-i]);
g(1,n-i);
}
}
int main() {
while(cin>>n>>m&&!(n==0&&m==0)) {
for (int i=1;i<=n;i++) cin>>a1[i];
f();
for (int i=1;i<=n;i=i+m) {
cout<<a1[i];
if(i+m<=n)
cout<<" "; }
cout<<endl;
}
}