#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 2e5 + 10;
int n;
int a[N];
struct node{
int color;
vector<int> member;
};
vector<node> v;
void init(){
a[n+1] = 0x3f3f3f3f;
for(int i=1;i<=n;i++){
vector<int> t;
for(int j=i;j<=n+1;j++){
if(a[i] != a[j]){
node temp;
temp.color = a[i],temp.member = t;
v.push_back(temp);
i = j - 1;
break;
}
else t.push_back(j);
}
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
init();
while(v.size()){
for(int i=0;i<v.size();i++){
printf("%d ",v[i].member[0]);
reverse(v[i].member.begin(),v[i].member.end());
v[i].member.pop_back();
reverse(v[i].member.begin(),v[i].member.end());
}
puts("");
vector<node> t;
for(int i=0;i<v.size();i++){
if(v[i].member.size() > 0) t.push_back(v[i]);
}
vector<node> t2;
for(int i=0;i<t.size();i++){
if(t2.size() == 0){
t2.push_back(t[i]);
continue;
}
if(t2.back().color == t[i].color){
node temp;
temp.color = t[i].color;
for(auto b:t2.back().member) temp.member.push_back(b);
for(auto b:t[i].member) temp.member.push_back(b);
t2.pop_back();
t2.push_back(temp);
}
else t2.push_back(t[i]);
}
v = t2;
}
return 0;
}