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 Go (1.6) (judge verdict: Wrong Answer)

package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strconv"
	"strings"
)

//scanで一行づつ読み込む
var sc = bufio.NewScanner(os.Stdin)
var wtr = bufio.NewWriter(os.Stdout)

// var N, ss, ans, A, B, C int

//sort
// array := []int{5, 1, 4, 2, 3}
// sort.Sort(sort.IntSlice(array))
// sort.Sort(sort.Reverse(sort.IntSlice(arr)))

func main() {
	// A := strings.Split(nextLine(), " ")

	X := strings.Split(nextLine(), " ")
	Y := strings.Split(nextLine(), " ")

	N, _ := strconv.Atoi(X[0])

	// tmpA, _ := strconv.Atoi(X[0])
	// C, _ := strconv.Atoi(X[2])
	// A := int64(tmpA)

	arr := make([]int, N)
	ans := make([]int, 0, N)
	// K, _ := strconv.Atoi(X[2]) //strconv.ParseInt(X[2], 10, 64)

	// Y := strings.Split(nextLine(), " ")

	// q := make(que, 0)
	// taQue := make(tailAscQue, M)

	// ch := make(que, M)
	// mp := make(map[int]item, M)
	// ans := make([]int64, M)

	// Y := strings.Split(nextLine(), " ")
	// B := make([]int, M)

	for i := 0; i < N; i++ {
		arr[i], _ = strconv.Atoi(Y[i])
	}

	b := 0
	for i := N - 1; i >= 0; i-- {
		c := arr[i]
		tmp := make([]int, 0, N)
		j := 0
		for {

			// fmt.Fprintln(wtr, "c is : ", c, " current index is : ", i-j+1)

			tmp = append(tmp, c)
			j++

			if c == 1 || i-j < 0 {
				break
			}

			c = arr[i-j]
		}
		// ok := true
		// fmt.Fprintln(wtr, "tmp is : ", tmp)

		sort.Sort(sort.IntSlice(tmp))
		for i, v := range tmp {
			if v > len(ans)+i+1 {
				b = -1
				break
			}
		}
		ans = append(ans, tmp...)
		// fmt.Fprintln(wtr, "ans is : ", ans)
		if b < 0 {
			break
		}
		// fmt.Fprintln(wtr, "i-j is : ", i-j)

		if i-j < 0 {
			break
		}
		i = i - (j - 1)

	}

	if b < 0 {
		fmt.Fprintln(wtr, b)

	} else {
		for _, val := range ans {
			fmt.Fprintln(wtr, val)
		}
	}
	// fmt.Fprintln(wtr, ans)

	/*文字列連結高速化
	初期化:buf := make([]byte, 0,N+1)
	連結:buf=append(buf,str)
	出力:string(buf)
	*/
	// sort.Sort(sort.Reverse(dp[M][N]))

	// fmt.Fprintln(wtr, ans)
	_ = wtr.Flush()
}

func fact(n int64, c int) int64 {
	for i := 1; i <= c; i++ {
		n *= n - int64(i)
	}
	return n
}

// func dfs(dp []int, times int, arr []int) {
// 	if times >= N {
// 		ans = min(ans, calc(dp, arr))
// 		return
// 	}

// 	for i := 0; i < 4; i++ {
// 		dp[times] = i
// 		dfs(dp, times+1, arr)
// 	}
// }

type otosidama struct {
	x float64
	v string
}

type LR struct {
	l int
	r int
}

func chmax(a *string, b string) {
	if len(*a) < len(b) {
		*a = b
	} else if len(*a) == len(b) && *a < b {
		*a = b
	}
}

func gcd(a, b int) int {
	if b == 0 {
		return a
	}
	return gcd(b, a%b)
}

func nextLine() string {
	sc.Scan()
	return sc.Text()
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}
func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}
func com(a, b int) int {

	if a > b {
		return 0
	}
	return 0 //abs(a - b)
}

func abs(a int) int {
	if a < 0 {
		return a * -1
	}
	return a
}
func sum(a []int) (sum int) {
	for _, num := range a {
		sum += num
	}
	return
}

type item struct {
	// x int
	l int
	r int
}

type que []item

func (p que) Len() int {
	return len(p)
}

func (p que) Swap(i, j int) {
	p[i], p[j] = p[j], p[i]
}

func (p que) Less(i, j int) bool {

	// return p[i].point > p[j].point //p[i].x+p[i].y > p[j].x+p[j].y
	return p[i].l < p[j].l
}

// func (p *que) Len() int {
// 	return len(*p)
// }

// func (p *que) Swap(i, j int) {
// 	(*p)[i], (*p)[j] = (*p)[j], (*p)[i]
// }

// func (p *que) Less(i, j int) bool {

// 	// return p[i].point > p[j].point //p[i].x+p[i].y > p[j].x+p[j].y
// 	return (*p)[i].l < (*p)[j].l
// }

func (p *que) Push(in item) {
	var tmp *que = new(que)
	*tmp = make(que, len(*p)+1)
	copy(*tmp, *p)
	*tmp = append(*tmp, in)
	*p = *tmp
	// p = append(p, in)
	sort.Sort(p)
}

func (p *que) Pop() item {
	res := (*p)[0]
	*p = (*p)[1:]
	return res
}

func (p *que) Peek() item {
	return (*p)[0]
}

// type tailAscQue []item

// func (p *tailAscQue) Len() int {
// 	return len(*p)
// }

// func (p *tailAscQue) Swap(i, j int) {
// 	(*p)[i], (*p)[j] = (*p)[j], (*p)[i]
// }

// func (p *tailAscQue) Less(i, j int) bool {

// 	return (*p)[i].r < (*p)[j].r
// }

// func (p *tailAscQue) Push(in item) {
// 	var tmp *tailAscQue = new(tailAscQue)
// 	*tmp = make(tailAscQue, len(*p)+1)
// 	copy(*tmp, *p)
// 	*tmp = append(*tmp, in)
// 	*p = *tmp
// 	sort.Sort(p)
// }

// func (p *tailAscQue) Pop() item {
// 	res := (*p)[0]
// 	*p = (*p)[1:]
// 	return res
// }

// func (p *tailAscQue) Peek() item {
// 	return (*p)[0]
// }