uses math;
type lg=longint;
m1c=array[0..500000] of lg;
const run=1;
var a:m1c;
i,n,m:lg;
procedure insertionsort(var a:m1c;l,r:lg);
var i,j,tmp:lg;
begin
for i:=l+1 to r do
begin
j:=i-1; tmp:=a[i];
while (j>=l) and (a[j]>tmp) do
begin
a[j+1]:=a[j]; dec(j);
end;
a[j+1]:=tmp;
end;
end;
procedure merge(var a:m1c;l,m,r:lg);
var i,j,k:lg;
left,right:m1c;
begin
for i:= l to m do
left[i-l]:=a[i];
for i:=m+1 to r do
right[i-m-1]:=a[i];
i:=0; j:=i; k:=l;
while (i<m-l+1) and (j<r-m) do
begin
if (left[i]<right[j]) then
begin
a[k]:=left[i]; inc(i); inc(k);
end
else
begin
a[k]:=right[j]; inc(j); inc(k);
end;
end;
while (i<m-l+1) do
begin
a[k]:=left[i]; inc(i); inc(k);
end;
while (j<r-m) do
begin
a[k]:=right[j]; inc(j); inc(k);
end;
end;
procedure pigsort(var a:m1c; n:lg);
var l,m,r,i,tmp:lg;
begin
i:=0;
while (i<n) do
begin
insertionsort(a,i,min(i+run-1,n-1)); i:=i+run;
end;
tmp:=run;
while (tmp<n) do
begin
l:=0;
while (l<n) do
begin
r:=min(l+(tmp shl 1)-1,n-1); m:= l + tmp-1;
merge(a,l,m,r);
l:=l+(tmp shl 1);
end;
tmp:=tmp shl 1;
end;
end;
begin
readln(n,m);
for i:= 0 to n-1 do
read(a[i]);
if (n<=run) then insertionsort(a,0,n-1) else pigsort(a,n);
for i:= 0 to n-1 do
write(a[i],' ');
end.
dXNlcyBtYXRoOwp0eXBlIGxnPWxvbmdpbnQ7CgltMWM9YXJyYXlbMC4uNTAwMDAwXSBvZiBsZzsKY29uc3QgcnVuPTE7CnZhciBhOm0xYzsKCWksbixtOmxnOwpwcm9jZWR1cmUgaW5zZXJ0aW9uc29ydCh2YXIgYTptMWM7bCxyOmxnKTsKdmFyIGksaix0bXA6bGc7CmJlZ2luCglmb3IgaTo9bCsxIHRvIHIgZG8KCQliZWdpbgoJCQlqOj1pLTE7IHRtcDo9YVtpXTsKCQkJd2hpbGUgKGo+PWwpIGFuZCAoYVtqXT50bXApIGRvCgkJCQliZWdpbgoJCQkJCWFbaisxXTo9YVtqXTsgZGVjKGopOwoJCQkJZW5kOwoJCQlhW2orMV06PXRtcDsKCQllbmQ7CmVuZDsKcHJvY2VkdXJlIG1lcmdlKHZhciBhOm0xYztsLG0scjpsZyk7CnZhciBpLGosazpsZzsKCWxlZnQscmlnaHQ6bTFjOwpiZWdpbgoJZm9yIGk6PSBsIHRvIG0gZG8KCQlsZWZ0W2ktbF06PWFbaV07Cglmb3IgaTo9bSsxIHRvIHIgZG8KCQlyaWdodFtpLW0tMV06PWFbaV07CglpOj0wOyBqOj1pOyBrOj1sOwoJd2hpbGUgKGk8bS1sKzEpIGFuZCAoajxyLW0pIGRvCgkJYmVnaW4KCQkJaWYgKGxlZnRbaV08cmlnaHRbal0pIHRoZW4KCQkJCWJlZ2luCgkJCQkJYVtrXTo9bGVmdFtpXTsgaW5jKGkpOyBpbmMoayk7CgkJCQllbmQKCQkJZWxzZQoJCQkJYmVnaW4KCQkJCQlhW2tdOj1yaWdodFtqXTsgaW5jKGopOyBpbmMoayk7CgkJCQllbmQ7CgkJZW5kOwoJd2hpbGUgKGk8bS1sKzEpIGRvCgkJYmVnaW4KCQkJYVtrXTo9bGVmdFtpXTsgaW5jKGkpOyBpbmMoayk7CgkJZW5kOwoJd2hpbGUgKGo8ci1tKSBkbwoJCWJlZ2luCgkJCWFba106PXJpZ2h0W2pdOyBpbmMoaik7IGluYyhrKTsKCQllbmQ7CQplbmQ7CnByb2NlZHVyZSBwaWdzb3J0KHZhciBhOm0xYzsgbjpsZyk7CnZhciBsLG0scixpLHRtcDpsZzsKYmVnaW4KCWk6PTA7Cgl3aGlsZSAoaTxuKSBkbwoJCWJlZ2luCgkJCWluc2VydGlvbnNvcnQoYSxpLG1pbihpK3J1bi0xLG4tMSkpOyBpOj1pK3J1bjsKCQllbmQ7Cgl0bXA6PXJ1bjsKCXdoaWxlICh0bXA8bikgZG8KCQliZWdpbgoJCQlsOj0wOwoJCQl3aGlsZSAobDxuKSBkbwoJCQkJYmVnaW4KCQkJCQlyOj1taW4obCsodG1wIHNobCAxKS0xLG4tMSk7IG06PSBsICsgdG1wLTE7CgkJCQkJbWVyZ2UoYSxsLG0scik7CgkJCQkJbDo9bCsodG1wIHNobCAxKTsKCQkJCWVuZDsKCQkJdG1wOj10bXAgc2hsIDE7CgkJZW5kOwplbmQ7CmJlZ2luCQoJcmVhZGxuKG4sbSk7Cglmb3IgaTo9IDAgdG8gbi0xIGRvCgkJcmVhZChhW2ldKTsKCWlmIChuPD1ydW4pIHRoZW4gaW5zZXJ0aW9uc29ydChhLDAsbi0xKSBlbHNlIHBpZ3NvcnQoYSxuKTsKCWZvciBpOj0gMCB0byBuLTEgZG8KCQl3cml0ZShhW2ldLCcgJyk7CmVuZC4=