#include<stdio.h>
#define MAX 250//ヒープの最大サイズ
#define NIL -1//初期化用

/*構造体（木）*/
typedef struct {
  int key;
  int p_key;
  int r_key;
  int l_key;
}Node;

Node Tree[MAX];

/*プロトタイプ宣言*/
void makeTree(int );

/*グローバル変数*/
int heap_size = 0;


main() {

  int i;//counter

  scanf("%d", &heap_size);
  /**/
  //木を初期化する
  for(i = 1; i <= heap_size; i++) {
    Tree[i].key = NIL;
    Tree[i].p_key = NIL;
    Tree[i].r_key = NIL;
    Tree[i].l_key = NIL;
  }

  //keyをそれぞれ入力していく
  for(i = 1; i <= heap_size; i++) {
    scanf("%d", /**/&Tree[i].key); 
  }

  //makeTree関数で木を作成する
  for(i = 1; i <= heap_size; i++) {
    makeTree(i);
  }



  //結果出力
  for(i = 1; i <= heap_size; i++) {

    printf("node %d: key = %d, ", i, Tree[i].key);

    //Treeの要素の親がいればそれを表示
    if(Tree[i].p_key != NIL) {
      printf("parent key = %d, ", Tree[i].p_key);
    }

    //Treeの要素の左がいればそれを表示
    if(Tree[i].l_key != NIL) {
      printf("left key = %d, ", Tree[i].l_key);
    }

    //Treeの要素の右がいればそれを表示
    if(Tree[i].r_key != NIL) {
      printf("right key = %d, ", Tree[i].r_key);
    }

    printf("\n");

  }
return 0;
}



/*
*    makeTree関数...ヒープソートによって木を作成する。
*/
void makeTree(int u) {

  //二つ目以降は親がいる
  //今回は完全２分木なので[u/2]をして、二つの子に親をつける
  if(u != 1) {
    Tree[u].p_key = Tree[u/2].key;
  }

  //2倍したuでもheap_sizeを超さない＝左の子供は確実に存在する
  if(2*u <= heap_size) {
    Tree[u].l_key = Tree[2*u].key;
  }

  //2倍＋１したuでもheap_sizeを超さない＝右の子供は確実に存在する
  if(2*u+1 <= heap_size) {
    Tree[u].r_key = Tree[2*u+1].key;
  }

}