#include<iostream>
#include<algorithm>
#include<vector>
#include<sstream>
using namespace std;
int dfs(vector<int>nums, int idx)
{
if((2*idx + 1 >= nums.size() || nums[2*idx + 1] == -1) && (2*idx + 2 >= nums.size() || nums[2*idx + 2] == -1))
{
return idx;
}
else
{
int idx_left = dfs(nums, 2*idx + 1);
int idx_right = dfs(nums, 2*idx + 2);
if(idx_left >= nums.size() || nums[idx_left] == -1)
{
return idx_right;
}
else if(idx_right >= nums.size() || nums[idx_right] == -1)
{
return idx_left;
}
else
{
return nums[idx_left] < nums[idx_right] ? idx_left : idx_right;
}
}
}
int main()
{
vector<int> nums;
int num;
string line;
getline(cin, line);
stringstream ss(line);
while(ss >> num)
{
nums.push_back(num);
}
int idx = dfs(nums, 0);
vector<int> path;
while(idx > 0)
{
path.push_back(nums[idx]);
idx = (idx - 1) / 2;
}
path.push_back(nums[0]);
reverse(path.begin(), path.end());
for(int i = 0; i < path.size(); i++)
{
if(i == path.size() - 1)
{
cout << path[i];
}
else
{
cout << path[i] << " ";
}
}
return 0;
}