#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
const int INF=0x3f3f3f3f;
struct Huffman_Node{
int ans;
int father;
int left;
int right;
}H_Node[maxn];
int n;
void init()///初始化
{
for (int i=0;i<(n+n-1);++i)
{
H_Node[i].father = -1;
H_Node[i].left = -1;
H_Node[i].right = -1;
}
}
int H[maxn];
int main()
{
scanf("%d",&n);
init();
memset(H,-1,sizeof(H));
for(int i=0;i<n;++i)
{
scanf("%d",&H_Node[i].ans);
}
for (int j=1;j<n;++j)///n个叶子节点,最多合并n-1次
{
int m1 = INF;///最小的数
int m2 = INF;///第二小的数
int idx_1 = -1;
int idx_2 = -1;
for (int t=0;t<n+j-1;++t)
{
///cout<<"fa"<<' '<<H_Node[t].father<<endl;
if (H_Node[t].father==-1)
{
if (H_Node[t].ans < m1)
{
idx_2 = idx_1;
idx_1 = t;
m2 = m1;
m1 = H_Node[t].ans;
}
else if (H_Node[t].ans < m2)
{
m2 = H_Node[t].ans;
idx_2 = t;
}
}
}
/// cout<<idx_1<<' '<<idx_2<<endl;
H_Node[n+j-1].ans = H_Node[idx_1].ans + H_Node[idx_2].ans;///合并概率
///cout<<H_Node[n+j-1].ans<<endl;
H_Node[idx_2].father = n+j-1;
H_Node[idx_1].father = n+j-1;
H_Node[n+j-1].left = idx_1;
H_Node[n+j-1].right = idx_2;
}
for (int i=0;i<n;++i)
{
int F=H_Node[i].father;
///cout<<F<<endl;
int C=i;
int cnt = n;
while (F != -1)
{
if (H_Node[F].left==C)
{
H[--cnt]=0;
///cout<<0;
}
else
{
H[--cnt]=1;
///cout<<1;
}
C = F;
F = H_Node[F].father;
}
for (int j=cnt;j<n;++j)
{
printf("%d",H[j]);
}
puts("");
}
return 0;
}