                                        /*,---.   ,--.                          ,--.
                                        '   .-'  |  ,---.  ,--.,--. ,--.  ,--. `--'
                                        `.  `-.  |  .-.  | |  ||  |  \  `'  /  ,--.
                                        .-'    | |  | |  | '  ''  '   \    /   |  |
                                        `-----'  `--' `--'  `----'     `--'    `--'*/
#include <iostream>
#include <sstream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <math.h>
#include <memory>
#include <cctype>
#include <cstring>
#include <vector>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <numeric>
#include <iomanip>
#include <unordered_set>
#include <unordered_map>
#include <cstdlib>
#include <random>
#include <chrono>

using namespace std;

int n;
long long a,b;
int value[200005];
long long res1, res2;
vector<int> vec;
bool lose = false;
void can_be(int start, int end){
    if(end == -1){
        end = n;
    }
    vec.push_back(1);
    for(int i = 2;i<=n;i++){
        for(int pos = start + 1;pos<end;pos++){
            if(value[pos] == i && pos - start + 1 >= i){
                vec.push_back(value[pos]);
            }
            else if(value[pos] == i && pos - start + 1 < i){
                lose = true;
            }
        }
    }
}
int main() {
    cin >> n;
    int last = -1;
    for(int i = 0;i<n;i++){
        cin >> value[i];
    }
    for(int i = n-1;i>=0;i--){
        if(lose){
            cout<<-1;
            return 0;
        }
        if(value[i] == 1){
            can_be(i, last);
            last = i;
        }
    }
    if(last == -1){
        cout<<-1;
        return 0;
    }
    for(int i = 0;i<vec.size();i++){
        cout<<vec[i]<<" ";
    }
}
