```go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var n int
if _, err := fmt.Fscan(in, &n); err != nil {
return
}
a := make([]int, n)
for i := 0; i < n; i++ {
fmt.Fscan(in, &a[i])
}
big := 1000000
b := make([]int, n)
for i := range b {
b[i] = -1
}
prev := 0
slots := make([]int, 0)
ok := true
for i := 0; i < n && ok; i++ {
if a[i] < prev {
ok = false
break
}
if a[i] == prev {
slots = append(slots, i)
} else {
need := a[i] - prev - 1
if len(slots) < need {
ok = false
break
}
val := prev + 1
for k := 0; k < need; k++ {
pos := slots[0]
slots = slots[1:]
b[pos] = val
val++
}
for _, pos := range slots {
b[pos] = big
}
slots = slots[:0]
b[i] = prev
prev = a[i]
}
}
if !ok {
fmt.Fprintln(out, -1)
return
}
for _, pos := range slots {
b[pos] = big
}
for i := 0; i < n; i++ {
if i > 0 {
fmt.Fprint(out, " ")
}
fmt.Fprint(out, b[i])
}
fmt.Fprintln(out)
}
```