#include<iostream>
using namespace std;
int n,*k;
void Show(){
cout<<n<<" ";
for(int i=1;i<=n;i++){
cout<<k[i];
if(i==n)
cout<<endl;
else cout<<" ";
}
}
void S(int p,int m){//小顶堆
int i,j;
i=p;j=i*2;
while(j<=m){
if(j<=m-1&&k[j]>k[j+1])//改为<
j++;
if(k[j]>=k[i])//改为<=,则为大顶堆
break;
else{
swap(k[i],k[j]);
i=j;
j=i*2;
}
}
}
void Shift(){
int i,j;
for(i=n/2;i>0;i--)//建堆
S(i,n);
Show();
for(i=n;i>1;i--)//排序
{
swap(k[i],k[1]);
S(1,i-1);
Show();
}
}
int main(){
int i,j,t;
cin>>n;
k=new int[n+1];
for(i=1;i<=n;i++)
cin>>k[i];
Shift();
return 0;
}