#include<iostream>
#include<cstring>
#include<vector>
#include<utility>
#include<map>
#include<set>
#include<unordered_map>
#include<algorithm>
#include<cmath>
#include<queue>
#include<unordered_set>
#include<stack>
#include<array>
#include<iomanip> 

using namespace std;

#define int long long 
#define ld long double 
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define endl "\n"
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define MOD 1000000007
#define UPAR 1000000000000
#define MAXN 50000

int graph[500][500];
int n;
int dir[4][2] = {{1, 0}, {0, 1}, {0, -1}, {-1, 0}};

int DFS(int x, int y, int val, int num){
	if(num == 0){
		return 0;
	}

	graph[x][y] = val;
	int ret = 1;

	for (int i = 0; i < 4; ++i)
	{
		int a = x + dir[i][0];
		int b = y + dir[i][1];

		if(a < 0 || a >= n || b < 0 || b >= n || b > a || graph[a][b] != -1)
			continue;

		int done = DFS(a, b, val, num - ret);
		ret += done;
	}
	return ret;
}

int32_t main(){
	IOS;
	cin >> n;

	memset(graph, -1, sizeof(graph));

	vector<int> v(n);

	for (int i = 0; i < n; ++i)
	{
		cin >> v[i];
	}

	for (int i = n - 1; i >= 0; i--)
	{
		int cnt = DFS(i, i, v[i], v[i]);
		if(cnt != v[i]){
			cout << -1 << endl;
		}
	}

	for (int i = 0; i < n; ++i)
	{
		for (int j = 0; j <= i; ++j)
		{
			cout << graph[i][j] << " ";
		}
		cout << endl;
	}
}