#include <iostream>
using namespace std;
int n;
int *a, *b, **s, **w, **m;
void bost(int *b, int *a, int **w, int **m, int **s)
{
int i,j,k,r,t;
for (i = 0; i <= n; i++)
{
w[i + 1][i] = a[i];
m[i + 1][i] = 0;
}
for (r = 0; r <n; r++)
{
for (i = 1; i <= n - r; i++)
{
j = i + r;
w[i][j] = w[i][j - 1] + b[j] + a[j];
m[i][j] = m[i + 1][j];
s[i][j] = i;
for (k = i + 1; k <= j; k++)
{
t = m[i][k - 1] + m[k + 1][j];
if (t<m[i][j])
{
m[i][j] = t;
s[i][j] = k;
}
}
m[i][j] += w[i][j];
}
}
}
void T(int i, int j, int **s)//构造最优解
{
if (j>i)
{
int root = s[i][j];//根节点
cout << "s" << root << "是根" << endl;
if (s[i][root - 1]>0)
{
cout << "s" << root << "的左孩子是s" << s[i][root - 1] << endl;
}
if (s[root + 1][j]>0)
{
cout << "s" << root << "的右孩子是s" << s[root + 1][j] << endl;
}
T(i, root - 1, s);
T(root + 1, j, s);
}
}
int main()
{
int i;
cin >> n;
a = new int[n + 1];//失败的概率
b = new int[n + 1];//成功的概率
s = new int *[n + 2];//根节点
w = new int *[n + 2];
m = new int *[n + 2];
for (i = 0; i < n + 2; i++)
{
s[i] = new int[n + 2];
m[i] = new int[n + 2];
w[i] = new int[n + 2];
}
for (i = 1; i <= n; i++)
cin >> b[i];
for (i = 0; i <= n; i++)
cin >> a[i];
bost(b, a, w, m, s);
T(1, n, s);//最优解
return 0;
}