Problem:
Score : 400 points

Problem Statement

Snuke has an empty sequence a.

He will perform N operations on this sequence.

In the i-th operation, he chooses an integer j satisfying 1 \leq j \leq i, and insert j at position j in a (the beginning is position 1).

You are given a sequence b of length N. Determine if it is possible that a is equal to b after N operations. If it is, show one possible sequence of operations that achieves it.

Constraints

All values in input are integers.

1 \leq N \leq 100

1 \leq b_i \leq N

Input

Input is given from Standard Input in the following format:

N
b_1 \dots b_N

Output

If there is no sequence of N operations after which a would be equal to b, print -1.
If there is, print N lines. In the i-th line, the integer chosen in the i-th operation should be printed. If there are multiple solutions, any of them is accepted.

Sample Input 1

3
1 2 1

Sample Output 1

1
1
2

In this sequence of operations, the sequence a changes as follows:

After the first operation: (1)

After the second operation: (1,1)

After the third operation: (1,2,1)

Sample Input 2

2
2 2

Sample Output 2

-1

2 cannot be inserted at the beginning of the sequence, so this is impossible.

Sample Input 3

9
1 1 1 2 2 1 2 3 2

Sample Output 3

1
2
2
3
1
2
2
1
1

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <iostream>
#include <string>
#include <cstdlib>
#include <vector>
#include <sstream>
#include <set>
#include <tuple>
#include <algorithm>
#include <memory>
#include <numeric>
#include <queue>
#include <functional>
#include <cmath>
#include <cstring>
#include <map>
#include <unordered_map>
#include <sstream>
#include <iomanip>

using namespace std;
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; }

typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> P;
typedef pair<ll, P> PP;

const ll INF = 1LL << 60;
const ll MOD = 1000000007;

bool f(const vector<ll>& b)
{
	if (b.size() == 0) return true;

	bool flag = false;
	for (ll i = 0; i < b.size(); ++i)
	{
		if (b[i] > i + 1)
		{
			flag = false;
			break;
		}

		if (b[i] == i + 1)
		{
			flag = true;
			break;
		}
	}
	if (!flag) return false;

	for (ll i = b.size()-1; i >= 0; --i)
	{
		if (b[i] == i + 1)
		{
			vector<ll> tmp_b(b.size()-1);
			for (ll j = 0; j < b.size()-1; ++j)
			{
				if (j < i) tmp_b[j] = b[j];
				if (j >= i) tmp_b[j] = b[j+1];
			}

			bool retval = f(tmp_b);

			if (retval)
			{
				//trace = true;
				cout << i + 1 << endl;
				return true;
			}
			else
			{
				return false;
			}
		}
	}

	return false;
}

int main()
{
	cin.tie(0);
	ios::sync_with_stdio(false);

	ll N;
	cin >> N;

	vector<ll> b(N);
	for (ll i = 0; i < N; ++i) cin >> b[i];

	bool retval = f(b);

	if (!retval)
	{
		cout << -1 << endl;
	}

	//system("pause");
}