#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
int pri[MAXN],val[MAXN],siz[MAXN],ls[MAXN],rs[MAXN],tag[MAXN],fa[MAXN],mn[MAXN];
int id[MAXN];
struct Element
{
int x,y;
bool operator<(const Element &j) const
{
return x==j.x?y<j.y:x<j.x;
}
}a[MAXN];
int tot=0,rt=0,N,M;
inline int New(int x)
{
pri[++tot]=rand();
val[tot]=mn[tot]=x;
siz[tot]=1;
ls[tot]=rs[tot]=0;
tag[tot]=0;
return tot;
}
inline void PushUp(int p)
{
siz[p]=siz[ls[p]]+siz[rs[p]]+1;
mn[p]=val[p];
if(ls[p]) mn[p]=min(mn[p],mn[ls[p]]);
if(rs[p]) mn[p]=min(mn[p],mn[rs[p]]);
return;
}
inline void PushDown(int p)
{
if(tag[p])
{
swap(ls[p],rs[p]);
if(ls[p]) tag[ls[p]]^=1;
if(rs[p]) tag[rs[p]]^=1;
}
tag[p]=0;
return;
}
inline void Split(int p,int k,int &x,int &y,int fax,int fay)
{
if(p==0)
{
x=y=0;
return;
}
PushDown(p);
if(siz[ls[p]]<k)
{
x=p;
Split(rs[p],k-siz[ls[p]]-1,rs[p],y,p,fay);
}
else
{
y=p;
Split(ls[p],k,x,ls[p],fax,p);
}
PushUp(p);
}
inline int Merge(int p,int q)
{
if(!p||!q) return p | q;
if (pri[p]<pri[q])
{
PushDown(p);
rs[p]=Merge(rs[p],q);
PushUp(p);return p;
}
PushDown(q);
ls[q]=Merge(p,ls[q]);
PushUp(q);return q;
}
int Rank(int p)
{
int res=1;
while(1)
{
PushDown(p);
if(ls[p]&&mn[ls[p]]==mn[p]) p=ls[p];
else if(rs[p]&&mn[rs[p]]==mn[p]) p=rs[p],res+=siz[ls[p]]+1;
else return res+siz[ls[p]];
}
}
int ans[MAXN];
int main()
{
srand(time(NULL));
scanf("%d",&N);
for(int i=1;i<=N;i++)
{
scanf("%d",&a[i].x);
a[i].y=i;
id[a[i].y]=i;
}
sort(a+1,a+N+1);
for(int i=1;i<=N;i++) ans[a[i].y]=i;
for(int i=1;i<=N;i++)
{
rt=Merge(rt,New(ans[i]));
}
for(int i=1;i<=N;i++)
{
int k=Rank(rt);
int ra,rb,rc;
Split(rt,k,ra,rb,0,0);
Split(ra,k-1,ra,rc,0,0);
tag[ra]^=1;
rt=Merge(ra,rb);
printf("%d ",k+i-1);
}
puts("");
return 0;
}