#include <iostream>
#include <vector>
using namespace std;
const int N=1000001;
int dsu1[N]={},dsu2[N]={};
bool vis[N]={};
int getfather(int dsu[],int u){
if(dsu[u]==u){
return u;
}
dsu[u]=getfather(dsu,dsu[u]);
return dsu[u];
}
int unite1(int u,int v){
dsu1[getfather(dsu1,u)]=getfather(dsu1,v);
}
int unite2(int u,int v){
dsu2[getfather(dsu2,u)]=getfather(dsu2,v);
}
int n=0;
int a[N]={};
vector<int> ans[N];
int k=0,cnt=0;
int ii=1,jj=1;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
dsu1[i]=i;
dsu2[i]=i;
}
for(int i=2;i<=n;i++){
if(a[i]==a[i-1]){
unite2(i-1,i);
}
}
for(int i=n+1;i<N;i++){
dsu1[i]=i;
dsu2[i]=i;
}
while(cnt<n){
k++;
ii=1;
jj=1;
while(ii<=n&&cnt<n){
jj=getfather(dsu1,ii);
if(jj==getfather(dsu2,jj)){
if(!vis[jj]&&jj<=n){
vis[jj]=1;
ans[k].push_back(jj);
cnt++;
if(jj<n&&a[jj+1]==a[jj]){
unite1(jj,jj+1);
}
else if(getfather(dsu2,jj+1)+1<n){
unite1(jj,getfather(dsu2,jj+1)+1);
}
if(jj<n&&ii>1){
unite2(ii-1,jj+1);
}
}
}
else{
if(!vis[jj]&&jj<=n){
vis[jj]=1;
ans[k].push_back(jj);
cnt++;
if(jj<n&&a[jj+1]==a[jj]){
unite1(jj,jj+1);
}
else if(getfather(dsu2,jj+1)+1<n){
unite1(jj,getfather(dsu2,jj+1)+1);
}
}
}
ii=getfather(dsu2,ii)+1;
}
}
for(int i=1;i<=k;i++){
if(ans[i].empty()){
break;
}
for(int j=0;j<ans[i].size();j++){
cout<<ans[i][j]<<" ";
}
cout<<endl;
}
return 0;
}