import java.util.Scanner;
public class MainTest{
public static void main(String[] args){
int n;//一共有多少个矩阵
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
//存放矩阵的行数和列数
int[] p= new int[n+1];//矩阵A1的行数和列数是p0,p1,以此类推
Scanner in = new Scanner(System.in);
for(int i = 0;i<p.length;i++){
p[i] = in.nextInt();
}
//然后开始填表
int[][] m = new int[n+1][n+1];//m[i][j]表示i矩阵到j矩阵最少的乘法次数
int[][] s = new int[n+1][n+1];//s[i][j]表示i矩阵到j矩阵从哪个地方画括号
for(int i = 1; i <= n; i++){
for(int j = 1;j<=n;j++){
if(i == j){
m[i][j]=0;//比如说m[1][1],矩阵1到矩阵1,一个矩阵没法乘,所以乘法次数为0
}
}
}
for(int r = 2;r<=n;r++){
for(int k = 1;k <= n-r+1;k++){
int g = k+r-1;
m[k][g] = m[k+1][g] + p[k-1]*p[k]*p[g];//纵向
//算每个对角线。m[1][2] = m[2][2]+p0*p1*p2;隐藏了m[1][1]
//m[1][3] = m[2][3] + p0*p2*p3;//隐藏了m[1][1];
//m[2][4] = m[3][4] + p2*p3*p4隐藏了m[2][2];
s[k][g] = k;//分割位置
for(int b = k+1;b<g;b++){//横向
int t = m[k][b]+m[b+1][g]+p[k-1]*p[b]*p[g];
if(t < m[k][g]){
m[k][g] = t;
s[k][g] = b;
}
}
}
}
//System.out.println(m[1][n]);
for(int i = 1;i<=n;i++){
for(int j = 1;j<=n;j++){
System.out.print(s[i][j]+" ");
}
System.out.println();
}
}
}