#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mp make_pair
#define mt make_tuple
#define pii pair<int,int>
#define pll pair<ll,ll>
#define ldb double
template<typename T>void ckmn(T&a,T b){a=min(a,b);}
template<typename T>void ckmx(T&a,T b){a=max(a,b);}
void rd(int&x){scanf("%i",&x);}
void rd(ll&x){scanf("%lld",&x);}
void rd(char*x){scanf("%s",x);}
void rd(ldb&x){scanf("%lf",&x);}
void rd(string&x){scanf("%s",&x);}
template<typename T1,typename T2>void rd(pair<T1,T2>&x){rd(x.first);rd(x.second);}
template<typename T>void rd(vector<T>&x){for(T&i:x)rd(i);}
template<typename T,typename...A>void rd(T&x,A&...args){rd(x);rd(args...);}
template<typename T>void rd(){T x;rd(x);return x;}
int ri(){int x;rd(x);return x;}
template<typename T>vector<T> rv(int n){vector<T> x(n);rd(x);return x;}
template<typename T>void ra(T a[],int n,int st=1){for(int i=0;i<n;++i)rd(a[st+i]);}
template<typename T1,typename T2>void ra(T1 a[],T2 b[],int n,int st=1){for(int i=0;i<n;++i)rd(a[st+i]),rd(b[st+i]);}
template<typename T1,typename T2,typename T3>void ra(T1 a[],T2 b[],T3 c[],int n,int st=1){for(int i=0;i<n;++i)rd(a[st+i]),rd(b[st+i]),rd(c[st+i]);}
void re(vector<int> E[],int m,bool dir=0){for(int i=0,u,v;i<m;++i){rd(u,v);E[u].pb(v);if(!dir)E[v].pb(u);}}
template<typename T>void re(vector<pair<int,T>> E[],int m,bool dir=0){for(int i=0,u,v;i<m;++i){T w;rd(u,v,w);E[u].pb({v,w});if(!dir)E[v].pb({u,w});}}

// C

const int N=200050;
int p[N],pos[N];
int main(){
	int n=ri();
	ra(p,n);
	for(int i=1;i<=n;i++)pos[p[i]]=i;
	vector<int> ans;
	int mx=0;
	for(int i=1;i<=n;i++){
		int j=pos[i];
		if(j==i)continue;
		if(mx!=i-1)return 0*printf("-1\n");
		mx=j-1;
		while(j>i){
			ans.pb(j-1);
			swap(pos[p[j]],pos[p[j-1]]);
			swap(p[j],p[j-1]);
			j--;
		}
	}
	if(ans.size()!=n-1)return 0*printf("-1\n");
	for(int i:ans)printf("%i\n",i);
	return 0;
}

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int sz = 2e5+5;

int n, a[sz], w[sz], bit[sz];

void add(int x) {
   while(x <= n) {
      bit[x]++;
      x += x & (-x);
   }
}

int quer(int x) {
   int ans = 0;
   while(x) {
      ans += bit[x];
      x -= x & (-x);
   }
   return ans;
}

int main() {
   cin >> n;
   for(int i=1; i<=n; i++) scanf("%d", &a[i]), w[a[i]] = i;

   int tot = 0;
   vector <int> res;
   for(int i=n; i; i--) {
      int x = quer(w[i]);
      if(x) tot += x, res.push_back(x);
      add(w[i]);
   }
   if(tot == n-1) {
      reverse(res.begin(), res.end());
      int s = 0;
      for(int x : res) {
         for(int i=s+x; i>s; i--) printf("%d\n", i);
         s += x;
      }
   }
   else puts("-1");
}
