思路
#include <bits/stdc++.h>
//#define int long long
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
using namespace std;
struct node
{
int win, lose;
}tree[1 << 19];
int k;
int dfs(int v)
{
if(v >= (1 << k)) return 1;
if(tree[v].win < tree[v].lose) return 0;
tree[v * 2].win = tree[v].win;
tree[v * 2 + 1].win = tree[v].lose;
if(dfs(v * 2) && dfs(v * 2 + 1)) return 1;
tree[v * 2].win = tree[v].lose;
tree[v * 2 + 1].win = tree[v].win;
if(dfs(v * 2) && dfs(v * 2 + 1)) return 1;
return 0;
}
signed main()
{
cin >> k;
//cout << (1 << k) << endl;
for(int i = 1; i <= k; i ++)
{
//cout << 1 << (k - i) << ' ' << ((1 << (k - i + 1)) - 1) << endl;
for(int j = 1 << (k - i); j < 1 << (k - i + 1); j ++)
{
//cout << j << endl;
cin >> tree[j].lose;
}
//cout << endl;
}
cin >> tree[1].win;
if(dfs(1) == 1)
{
for(int i = 1 << (k - 1); i < 1 << (k - 1 + 1); i ++)
{
if(i == (1 << (k - 1))) cout << tree[i].win << ' ' << tree[i].lose;
else cout << ' ' <<tree[i]. win << ' ' << tree[i].lose;
}
}
else cout << "No Solution" << endl;
return 0;
}