#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <unordered_map>
#include <unordered_set>
#include <string.h>
#include <bitset>
#include <random>

#define pb push_back
#define mp make_pair
#define fst first
#define snd second
#define ll long long
#define forn(i, n) for (int i = 0; i < (int) (n); i++)
#define forlr(i, l, r) for (int i = (int) l; i <= (int) (r); i++)
#define forrl(i, r, l) for (int i = (int) r; i >= (int) (l); i--)
#define sz(x) (int) ((x).size())


#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops")
#pragma GCC optimize("no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

using namespace std;

const int MAX_N = 1001;
const ll INF = 2000000000ll;
const ll LLINF = 1000000000000000000ll;
const int MOD = 1000000007;  //  998244353;


int a[MAX_N];
int res[MAX_N][MAX_N];
int n;

void go(int x, int y, int k, int c) {
    res[x][y] = c;
    if (k == 1) {
        return;
    }
    if (y - 1 >= 0 && res[x][y - 1] == -1) {
        go(x, y - 1, k - 1, c);
        return;
    }
    if (x + 1 < n && res[x + 1][y] == -1) {
        go(x + 1, y, k - 1, c);
        return;
    }

    cout << "-1\n";
    exit(0);
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
//    freopen("a.in", "rt", stdin);
//    freopen("a.out", "wt", stdout);

    cout.precision(10);
    cout << fixed;


    cin >> n;

    forn(i, n) {
        cin >> a[i];
        forn(j, n) {
            res[i][j] = -1;
        }
    }

    forn(i, n) {
        go(i, i, a[i], a[i]);
    }

    forn(i, n) {
        forn(j, i + 1) {
            cout << res[i][j] << " ";
        }
        cout << "\n";
    }

    return 0;
}