#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 

using namespace __gnu_pbds; 
using namespace std;

#define int           long long
#define S             second
#define F             first
#define pb            push_back
#define all(c)        (c).begin(),(c).end()
#define rall(c)       (c).rbegin(),(c).rend() 
#define lb            lower_bound
#define ub            upper_bound
#define si(c)         (int)((c).size())
#define lcm(a, b)      (a * (b / __gcd(a,b)))  
#define inf           (int)(1e10)
#define endl          '\n'
#define mp            make_pair
#define time(s)       (double(clock()-s)/double(CLOCKS_PER_SEC))
#define debug(args...)    _F(#args, args)
#define vi            std::vector<int>
#define pii           pair<int, int> 
#define vpi           vector<pii>
#define ordered_set   tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> 

clock_t start;
mt19937_64 rng(chrono::system_clock::now().time_since_epoch().count());

template<typename T> void _F(const char *name, T arg1){ cerr << name << " = " << arg1 << endl;}
template<typename T, typename... Args> void _F(const char *names, T arg1, Args... args)
{ const char *name = strchr(names, ',');cerr.write(names, name-names) << " = " << arg1 << endl;_F(name+2, args...);}

template< typename T1, typename T2 > istream& operator>>(istream& in, pair<T1, T2> &q){ in >> q.F >> q.S; return in;}
template< typename T1, typename T2 > ostream& operator<<(ostream& out, pair<T1, T2> &q){ out << q.F << " " << q.S; return out;}
template< typename T1, typename T2 > pair<T1, T2> operator+(pair<T1, T2> p1, pair<T1, T2> p2){ return {p1.F+p2.F, p1.S+p2.S};}
template< typename T1, typename T2 > pair<T1, T2> operator-(pair<T1, T2> p1, pair<T1, T2> p2){ return {p1.F-p2.F, p1.S-p2.S};}
template< typename T1, typename T2 > bool operator<(pair<T1, T2> p1, pair<T1, T2> p2){ return p1 < p2 ;}

template<typename T> void Unique(vector<T> &v) {
    sort(all(v)), v.resize(distance(v.begin(), unique(all(v))));
}  

void No() {
	cout << -1 << endl;
	exit(0);
}

void solve() {
	int n;
	cin >> n;

	int p[n], pos[n];
	for(int i = 0; i < n; i++) {
		cin >> p[i], p[i]--;
		pos[p[i]] = i;
	}
	vpi ans;
	int mx = 0;
	for(int i = 0; i < n-1; i++) {
		if(pos[i] == i && mx == i) No();
		int t = pos[i];
		for(int j = pos[i]; j > max(i, mx); j--) {
			ans.pb(mp(j, j-1));
			swap(p[j], p[j-1]);
			swap(pos[p[j]], pos[p[j-1]]);
		}
		mx = max(mx, t);
		// cout << mx << endl;
		// for(int j = 0; j < n; j++)
		// 	cout << p[j] << " ";
		// cout << endl;
	}
	for(int i = 0; i < n; i++) {
		if(p[i] != i)No();
	}
	for(auto u : ans) {
		u.F += 1, u.S += 1;
		cout << u.S << endl;
	}
}

signed main() {

    ios_base::sync_with_stdio(0); 
    cin.tie(0); cout.tie(0);   
    start = clock(); 

    #ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin); 
    freopen("output.txt", "w", stdout);
    freopen("error.txt", "w", stderr);
    #endif   

    int test = 1;
    // cin >> test;
 
    cout << fixed << setprecision(12);
     
    for(int i = 1; i <= test; ++i){
    	solve();
    }

    cerr << time(start);
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define P pair<ll,ll>
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }

int main(){
  int n;
  cin>>n;
  vector<int> p(n);
  rep(i,n) cin>>p[i];
  int tmp=0;
  vector<int> ans;
  bool flag=0;
  while(tmp!=n-1){
    for(int i=tmp+1; i<n; i++){
      if(p[i]==tmp+1){
        for(int a=i; a>=tmp+1; a--){
          ans.push_back(a);
          p[a]=p[a-1];
        }
        p[tmp]=tmp+1;
        tmp=i;
        break;
      }
      if(i==n-1) flag=1;
    }
    if(flag) break;
  }
  bool ok=1;
  rep(i,n){
    if(p[i]!=i+1) ok=0;
  }
  if(ok && ans.size()==n-1){
    rep(i,n-1) cout<<ans[i]<<" ";
    cout<<endl;
  }
  else cout<<-1<<endl;
}