#include<bits/stdc++.h>
using namespace std;
#define N 200010
int n,len=1,dead,bf=1;
bool a[N];
stack<int>task;
int rd(){
int x=0;char c=0;
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9'){
x=10*x+c-'0';
c=getchar();
}
return x;
}
struct block{
int l,r,nex=-1,pre=-1;
bool v,live=1;
}b[N];
void init(){
int l=1;
for(int i=1;i<=n;i++){
if(a[i]!=a[i-1]&&i!=1){
l=i;
b[len].nex=len+1;
len++;
}
b[len].l=l;
b[len].r=i;
b[len].v=a[i];
if(len>1)b[len].pre=len-1;
}
}
void print(int &k){
if(!b[k].live)return;
if(b[b[k].pre].v!=b[k].v||b[k].pre==-1){
cout<<b[k].l<<' ';
b[k].l++;
}
if(b[k].l>b[k].r){
task.push(k);
b[k].live=0;
dead++;
}
k=b[k].nex;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
n=rd();
for(int i=1;i<=n;i++)a[i]=rd();
init();
while(dead<len){
int i=bf;
while(!b[i].live&&i<=len)i=b[i].nex;
bf=i;
while(i>0)print(i);
while(!task.empty()){
int k=task.top();
if(b[k].pre!=-1)b[b[k].pre].nex=b[k].nex;
if(b[k].nex!=-1)b[b[k].nex].pre=b[k].pre;
task.pop();
}
cout<<"\n";
}
return 0;
}