#include #include using namespace std; using namespace atcoder; #define rep(i,n)for (int i = 0; i < int(n); ++i) #define rrep(i,n)for (int i = int(n)-1; i >= 0; --i) #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() template void chmax(T& a, const T& b) {a = max(a, b);} template void chmin(T& a, const T& b) {a = min(a, b);} using ll = long long; using P = pair; using VI = vector; using VVI = vector; using VL = vector; using VVL = vector; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; int n2 = 1 << n; VI a(n2); rep(i, n2) cin >> a[i]; vector> conds; rep(i, n2) rep(j, n2) { int k = i ^ j; if (i <= j && j <= k) conds.emplace_back(i, j, k); } VI ans(n2); rrep(d, 30) { VI x(n2, -1); rep(i, n2) if (a[i] != -1) x[i] = a[i] >> d & 1; bool updated; do { updated = false; for(auto [i, j, k]: conds) { rep(_, 3) { if (x[i] == 0 && x[j] == 0) { if (x[k] == -1) { updated = true; x[k] = 0; } else if (x[k] == 1) { cout << "No\n"; return 0; } } swap(i, j), swap(j, k); } } } while(updated); rep(i, n2) if (x[i] == -1) x[i] = 1; rep(p, conds.size()) { auto [i, j, k] = conds[p]; if (x[i] && x[j] && x[k]) { swap(conds[p], conds.back()); conds.pop_back(); p--; } } rep(i, n2) ans[i] |= x[i] << d; } cout << "Yes" << endl; rep(i, n2) cout << ans[i] << " \n"[i + 1 == n2]; }