#include <stdio.h>
#include <stdlib.h>
#define max 1e9
typedef struct hnode{
    int weight;
    int lchild;
    int rchild;
    int parent;
    char s[1000];
}huffNode;
void select(huffNode huffmanTree[ ], int k, int *s1, int *s2);
//从huffmanTree数组的0到up-1中找出father为-1的且权重最小的结点赋给s1,s2,(为了保证答案唯一,请让s1的结点编号小于s2)
void CreateHuffTree(huffNode huffmanTree[ ], int W[ ], int N );
//创建哈夫曼树,W为权重数组,N为叶子结点个数
void code(huffNode huffmanTree[],int N){
    int i;
    for(i=N-1;i>=0;i--){
        char Code[1000];
        int start=0;
        int c=i;//记录下当前结点
        int j=huffmanTree[i].parent;//记录当前叶子结点的父结点
        while(j!=-1){//遍历到根结点
            if(huffmanTree[j].lchild==c)
            Code[start++]='0';
            else Code[start++]='1';
            c=j;
            j=huffmanTree[j].parent;
        }
        int q;
        for(q=1;q<=start;q++)
        huffmanTree[i].s[q-1]=Code[start-q];
    }

}
void printcode(huffNode huffmantree[],int N){
    int i,j;
    for(i=0;i<N;i++){
        printf("%d code:%s\n",huffmantree[i].weight,huffmantree[i].s);
    }
}
int main(){

    huffNode *ht;

    int i,N,*W;
    scanf("%d", &N);

    W = (int*)malloc (N * sizeof(int));
    ht=(huffNode *)malloc((2*N-1)*sizeof(huffNode));

    for(i = 0; i < N; i++)
        scanf("%d", &W[i]); //4

    CreateHuffTree(ht,W,N);//1 2 3 4
     printf("    weight   parent   lchild    rchild\n");
    for (i = 0; i < 2 * N - 1; i++) {
        printf("%d     %d      %d        %d        %d\n",i,ht[i].weight, ht[i].parent, ht[i].lchild, ht[i].rchild);
    }
    code(ht,N);
    printf("\nhuffman code:\n");
    printcode(ht,N);
    free(W);
    free(ht);
    return 0;
}
void CreateHuffTree(huffNode huffmanTree[ ], int W[ ], int N ) {
       int i,i1,i2,k;
       for (i = 0; i < N; i++) {   //叶子结点初始化
            huffmanTree[i].parent = -1;
            huffmanTree[i].lchild = -1;
            huffmanTree[i].rchild = -1;
            huffmanTree[i].weight = W[i];
       }
       for (k = N; k < 2*N-1; k++) {
            select(huffmanTree,k, &i1, &i2);
            huffmanTree[k].weight = huffmanTree[i1].weight+huffmanTree[i2].weight;
            huffmanTree[k].lchild = i1; huffmanTree[k].rchild = i2;
            huffmanTree[k].parent=-1;
            huffmanTree[i1].parent = k; huffmanTree[i2].parent = k;
    }
}
void select(huffNode huffmanTree[ ], int k, int *s1, int *s2)
{
    int i;
    int n,m;
    n=m=max;
    for(i=0;i<k;i++){
        if(huffmanTree[i].parent==-1)//未选中的结点
        if(huffmanTree[i].weight<n){
            n=huffmanTree[i].weight;
            *s1=i;
        }
    }
    for(i=0;i<k;i++){
        if(huffmanTree[i].parent==-1)
        if(huffmanTree[i].weight<m&&i!=*s1){
            m=huffmanTree[i].weight;
            *s2=i;
        }
    }
}// 从huffmanTree数组的0到up-1中找出father为-1的且权重最小的结点赋给s1,s2