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 Java8 (OpenJDK 1.8.0) (judge verdict: Time Limit Exceeded)


import java.util.*;

public class Main {
	static class Sub {
		List<Integer> vals = new ArrayList<>();

		boolean isEnable() {
			boolean result = true;
			for (int i = 0; i < vals.size(); ++i) {
				if (vals.get(i) > i + 1) {
					result = false;
					break;
				}
			}
			return result;
		}

		List<Integer> getInputs() {
			Collections.sort(vals);
			return vals;
		}
	}

	Deque<Integer> dfs(List<Integer> vals, Deque<Integer> prevs) {
		if (vals.size() == 1) {
			if (vals.get(0) == 1) {
				prevs.addFirst(vals.get(0));
				return prevs;
			} else {
				return null;
			}
		}
		boolean result = false;
		for (int i = vals.size() - 1; i >= 0; --i) {
			if (vals.get(i) == i + 1) {
				// この要素を取り除ける
				List<Integer> remain = new ArrayList<>();
				remain.addAll(vals.subList(0, i));
				remain.addAll(vals.subList(i + 1, vals.size()));
				prevs.addFirst(vals.get(i));
				Deque<Integer> remainResult = dfs(remain, prevs);
				if (remainResult != null) {
					result = true;
					break;
				}
			}
		}
		if (result) {
			return prevs;
		} else {
			return null;
		}
	}

	int N;
	int[] b;
	boolean isEnable = false;
	Deque<Sub> subs = new ArrayDeque<>();

	Main() {
		Scanner in = new Scanner(System.in);
		N = in.nextInt();
		b = new int[N];
		for (int i = 0; i < N; ++i) {
			b[i] = in.nextInt();
		}
		in.close();
	}

	boolean isEnable() {
		for (int i = 0; i < N; ++i) {
			if (b[i] > i + 1) {
				return false;
			}
		}
		return true;
	}

	void calc() {
		List<Integer> vals = new ArrayList<>();
		for (int i = 0; i < N; ++i) {
			vals.add(b[i]);
		}

		Deque<Integer> result = this.dfs(vals, new ArrayDeque<Integer>());
		if (result != null) {
			while (!result.isEmpty()) {
				System.out.println(result.pollFirst());
			}
		} else {
			System.out.println("-1");
		}
	}

	void show() {
		List<Integer> inputs = new ArrayList<>();
		while (!this.subs.isEmpty()) {
			Sub sub = this.subs.pollLast();
			inputs.addAll(sub.getInputs());
		}
		for (int i = 0; i < inputs.size(); ++i) {
			System.out.println(inputs.get(i));
		}
	}

	public static void main(String[] args) {
		Main ins = new Main();
		ins.calc();
	}
}