#include
#include
using namespace std;
typedef char * HuffmanCode[];
typedef struct
{
int weight;
int parent, lch, rch;
}HTNode,*HuffmanTree;
void Select(HuffmanTree &HT, int k, int &s1, int &s2)
{
int temp=HT[1].weight;
for (int i = 1; i <= k; ++i)
{
if (HT[i].weight <= temp)
s1 = i;
else continue;
}
for (int j = 1; j <= k; ++j)
{
if ((HT[j].weight <= temp) && (HT[j].weight>=HT[s1].weight))
s2 = j;
else continue;
}
}
void CreatHuffmanTree(HuffmanTree &HT, int n)
{
int m;
int s1, s2;
if (n <= 1) return;
m = 2 * n - 1;
HT = new HTNode[m + 1];//0号单元未用,HT[m]表示根节点
for (int i = 1; i <= m; ++i)
{
HT[i].lch = 0;
HT[i].rch = 0;
HT[i].parent = 0;
}
for (int i = 1; i <= n; ++i)
{
cin >> HT[i].weight;
}
for (int i = n + 1; i <= m; ++i)
{
Select(HT, i - 1, s1, s2);
//在HT[k](1≤k≤i-1)中选择两个其双亲域为0,
// 且权值最小的结点,
// 并返回它们在HT中的序号s1和s2
HT[s1].parent = i;
HT[s2].parent = i;
HT[i].lch = s1;
HT[i].rch = s2;
HT[i].weight = HT[s1].weight+HT[s2].weight;
}
}//构造哈夫曼树
void print(HuffmanTree HT, int n)
{
for (int i = 1; i <= 2*n-1; ++i)
{
cout << HT[i].weight<<" "<<HT[i].parent <<" "<< HT[i].lch << " "<< HT[i].rch << " "<< endl;
}
}
void main()
{
HuffmanTree HT;
int n;
cin >> n;
CreatHuffmanTree(HT, n);
print(HT, n);
}