Given an array a of length n, find another array, b, of length n such that:

  * for each i (1 ≤ i ≤ n) MEX(\\{b_1, b_2, …, b_i\})=a_i. 



The MEX of a set of integers is the smallest non-negative integer that doesn't belong to this set.

If such array doesn't exist, determine this.

Input

The first line contains an integer n (1 ≤ n ≤ 10^5) — the length of the array a.

The second line contains n integers a_1, a_2, …, a_n (0 ≤ a_i ≤ i) — the elements of the array a. It's guaranteed that a_i ≤ a_{i+1} for 1≤ i < n.

Output

If there's no such array, print a single line containing -1.

Otherwise, print a single line containing n integers b_1, b_2, …, b_n (0 ≤ b_i ≤ 10^6)

If there are multiple answers, print any.

Examples

Input


3
1 2 3


Output


0 1 2 

Input


4
0 0 0 2


Output


1 3 4 0 

Input


3
1 1 3


Output


0 2 1 

Note

In the second test case, other answers like [1,1,1,0], for example, are valid.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        FastReader input=new FastReader();
        PrintWriter out=new PrintWriter(System.out);
        int t=1;
        while(t-->0)
        {
            int n=input.nextInt();
            int a[]=new int[n];
            int b[]=new int[n];
            int max=-1;
            ArrayList<Integer> list=new ArrayList<>();
            for(int i=0;i<n;i++)
            {
                a[i]=input.nextInt();
                if(max<a[i]-1)
                {
                    list.add(i);
                    for(int j=max+1;j<=a[i]-1;j++)
                    {
                        b[list.get(list.size()-1)]=j;
                        list.remove(list.size()-1);
                    }
                    max=a[i]-1;
                }
                else
                {
                    list.add(i);
                }
            }
            for(int i=0;i<list.size();i++)
            {
                b[list.get(i)]=n+1;
            }
            for(int i:b)
            {
                out.print(i+" ");
            }
        }
        out.close();
    }
    public static void mergeSort(ArrayList<Integer> a,int p,int r)
    {
        if(p<r)
        {
            int q=(p+r)/2;
            mergeSort(a,p,q);
            mergeSort(a,q+1,r);
            merge(a,p,q,r);
        }
    }
    public static void merge(ArrayList<Integer> a,int p,int q,int r)
    {
        int n1=q-p+2;
        int L[]=new int[n1];
        int n2=r-q+1;
        int R[]=new int[n2];
        for(int i=p;i<=q;i++)
        {
            L[i-p]=a.get(i);
        }
        L[n1-1]=Integer.MAX_VALUE;
        for(int i=q+1;i<=r;i++)
        {
            R[i-q-1]=a.get(i);
        }
        R[n2-1]=Integer.MAX_VALUE;
        int x=0,y=0;
        for(int i=p;i<=r;i++)
        {
            if(L[x]<=R[y])
            {
                a.set(i,L[x]);
                x++;
            }
            else
            {
                a.set(i,R[y]);
                y++;
            }
        }
    }
    static class FastReader {
        BufferedReader br;
        StringTokenizer st;

        public FastReader() {
            br = new BufferedReader(new
                    InputStreamReader(System.in));
        }

        String next() {
            while (st == null || !st.hasMoreElements()) {
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }

        int nextInt() {
            return Integer.parseInt(next());
        }

        long nextLong() {
            return Long.parseLong(next());
        }

        double nextDouble() {
            return Double.parseDouble(next());
        }

        String nextLine() {
            String str = "";
            try {
                str = br.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return str;
        }
    }
}
