#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
const int sj=100010;
int n,a[sj],ans[sj],size,root;
struct Treap
{
int v,l,r,key,size;
}t[sj];
void update(int x)
{
t[x].size=t[t[x].l].size+t[t[x].r].size+1;
}
void rturn(int &x)
{
int tt=t[x].l;
t[x].l=t[tt].r;
t[tt].r=x;
t[tt].size=t[x].size;
update(x);
x=tt;
}
void lturn(int &x)
{
int tt=t[x].r;
t[x].r=t[tt].l;
t[tt].l=x;
t[tt].size=t[x].size;
update(x);
x=tt;
}
void cr(int &x,int y)
{
if(x==0)
{
size++;
x=size;
t[x].size=1;
t[x].v=y;
t[x].key=rand();
return;
}
t[x].size++;
if(y>t[x].v)
{
cr(t[x].r,y);
if(t[t[x].r].key<t[x].key) lturn(x);
}
else
{
cr(t[x].l,y);
if(t[t[x].l].key<t[x].key) rturn(x);
}
}
int query(int x,int y)
{
if(x==0) return 0;
if(t[t[x].l].size>=y) return query(t[x].l,y);
if(t[t[x].l].size+1<y) return query(t[x].r,y-t[t[x].l].size-1);
return t[x].v;
}
void sc(int &x,int y)
{
if(x==0) return;
if(t[x].v==y)
{
if(t[x].l*t[x].r==0) x=t[x].l+t[x].r;
else if(t[t[x].l].key<t[t[x].r].key)
rturn(x),sc(x,y);
else
lturn(x),sc(x,y);
}
else if(y>t[x].v)
t[x].size--,sc(t[x].r,y);
else t[x].size--,sc(t[x].l,y);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) cr(root,i);
for(int i=2;i<=n;i++) scanf("%d",&a[i]);
ans[n]=a[n]+1;
sc(root,ans[n]);
for(int i=n-1;i>1;i--)
{
ans[i]=query(root,a[i]+1);
sc(root,ans[i]);
}
ans[1]=t[root].v;
for(int i=1;i<=n;i++)
printf("%d\n",ans[i]);
return 0;
}