#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <stack>
#include <map>
#include <queue>
#include <cmath>
using namespace std;
struct TreeNode {
TreeNode* leftChild;
TreeNode* rightChild;
int data;
};
queue<TreeNode*> que;
int main() {
int n;
while (scanf("%d", &n) != EOF) {
TreeNode* root = new TreeNode; //创造一个根结点
root->leftChild = NULL;
root->rightChild = NULL;
scanf("%d", &root->data); //输入根结点的值
que.push(root); //把根结点放入队列
int curNodeNum = 1;
while (curNodeNum < n) { //当前结点数量 < 要求的结点数量
TreeNode* t = new TreeNode; //创建一个新的结点
t->leftChild = NULL;
t->rightChild = NULL;
scanf("%d", &t->data); //输入该结点的值
TreeNode* cur = que.front(); //当前队头结点
que.pop();
cur->leftChild = t; //把 t 放到 当前队头结点 的 左孩子
que.push(t); //放入队列中
if (++curNodeNum >= n) { //如果加入这个结点以后就没了,就退出循环
break;
}
TreeNode* t1 = new TreeNode; //再进行一次以上操作
t1->leftChild = NULL;
t1->rightChild = NULL;
scanf("%d", &t1->data);
cur->rightChild = t1; //放在右子树
que.push(t1);
if (++curNodeNum >= n) {
break;
}
}
int d;
scanf("%d", &d);
int total = 0;
int two = 1;
//计算一下在d这个深度有没有结点
for (int j = 1; j < d; j++) {
total += two;
two *= 2;
}
if (n <= total) {
printf("EMPTY\n");
continue;
}
int curdeep = 1;
while (!que.empty()) {
que.pop();
}
que.push(root);
while (curdeep != d) {
int size = que.size();
for (int i = 0; i < size; i++) {
TreeNode* curnode = que.front();
que.pop();
if (curnode->leftChild != NULL) {
que.push(curnode->leftChild);
}
if (curnode->rightChild != NULL) {
que.push(curnode->rightChild);
}
}
curdeep++;
}
//curdeep == d
int size = que.size();
for (int i = 0; i < size; i++) {
TreeNode* curnode = que.front();
que.pop();
printf("%d ", curnode->data);
}
printf("\n");
}
}