Problem p03097 (C++)

Buggy submission (status: Runtime Error):
/*
ЗАПУСКАЕМ
░ГУСЯ░▄▀▀▀▄░РАБОТЯГУ░░
▄███▀░◐░░░▌░░░░░░░
░░░░▌░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░▄▀▒▒▀▀▀▀▄
░░░▐░░░░▐▒▒▒▒▒▒▒▒▀▀▄
░░░▐░░░░▐▄▒▒▒▒▒▒▒▒▒▒▀▄
░░░░▀▄░░░░▀▄▒▒▒▒▒▒▒▒▒▒▀▄
░░░░░░▀▄▄▄▄▄█▄▄▄▄▄▄▄▄▄▄▄▀▄
░░░░░░░░░░░▌▌░▌▌░░░░░
░░░░░░░░░░░▌▌░▌▌░░░░░
░░░░░░░░░▄▄▌▌▄▌▌░░░░░
*/
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

using namespace std;
template <typename T1, typename T2> inline void chkmin(T1 &a, T2 b) {
  if (a > b)
    a = b;
}
template <typename T1, typename T2> inline void chkmax(T1 &a, T2 b) {
  if (a < b)
    a = b;
}
#define files(FILENAME)                                                        \
  read(FILENAME);                                                              \
  write(FILENAME)
#define read(FILENAME) freopen((FILENAME + ".in").c_str(), "r", stdin)
#define write(FILENAME) freopen((FILENAME + ".out").c_str(), "w", stdout)
#define all(c) (c).begin(), (c).end()
#define sz(c) (int)(c).size()
#define left left228
#define right right228
#define y1 y1228
#define mp make_pair
#define pb push_back
#define y2 y2228
const string FILENAME = "input";

vector<int> get(int a, int b, int n) {
  if (n == 1) {
    // cout << a << ' ' << b << endl;
    if (a + b != 1) {
      cout << "NO\n";
      exit(0);
    }
    vector<int> res;
    res.pb(a);
    res.pb(b);
    return res;
  }
  int a1 = 0, b1 = 0;
  int pos = -1;
  vector<int> g;
  for (int i = 0; i < n; i++) {
    if ((a ^ b) & (1 << i)) {
      pos = i;
      int uk = 0;
      for (int j = 0; j < n; j++) {
        if (i != j) {
          if (a & (1 << j)) {
            a1 += 1 << uk;
          }
          if (b & (1 << j)) {
            b1 += 1 << uk;
          }
          g.pb(j);
          uk++;
        }
      }
      break;
    }
  }
  vector<int> res1 = get(a1, a1 ^ 1, n - 1);
  vector<int> res2 = get(a1 ^ 1, b1, n - 1);
  vector<int> res;
  for (auto x : res1) {
    int nx = 0;
    for (int f = 0; f < n - 1; f++) {
      if (x & (1 << f)) {
        nx += 1 << g[f];
      }
    }
    if (a & (1 << pos)) {
      nx += 1 << pos;
    }
    res.pb(nx);
  }
  for (auto x : res2) {
    int nx = 0;
    for (int f = 0; f < n - 1; f++) {
      if (x & (1 << f)) {
        nx += 1 << g[f];
      }
    }
    if (b & (1 << pos)) {
      nx += 1 << pos;
    }
    res.pb(nx);
  }
  return res;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  //  read(FILENAME);
  int n, a, b;
  cin >> n >> a >> b;
  vector<int> res = get(a, b, n);
  cout << "YES\n";
  for (auto x : res) {
    cout << x << ' ';
  }
  cout << '\n';
  return 0;
}


Fixed submission:
/*
ЗАПУСКАЕМ
░ГУСЯ░▄▀▀▀▄░РАБОТЯГУ░░
▄███▀░◐░░░▌░░░░░░░
░░░░▌░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░▄▀▒▒▀▀▀▀▄
░░░▐░░░░▐▒▒▒▒▒▒▒▒▀▀▄
░░░▐░░░░▐▄▒▒▒▒▒▒▒▒▒▒▀▄
░░░░▀▄░░░░▀▄▒▒▒▒▒▒▒▒▒▒▀▄
░░░░░░▀▄▄▄▄▄█▄▄▄▄▄▄▄▄▄▄▄▀▄
░░░░░░░░░░░▌▌░▌▌░░░░░
░░░░░░░░░░░▌▌░▌▌░░░░░
░░░░░░░░░▄▄▌▌▄▌▌░░░░░
*/
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

using namespace std;
template <typename T1, typename T2> inline void chkmin(T1 &a, T2 b) {
  if (a > b)
    a = b;
}
template <typename T1, typename T2> inline void chkmax(T1 &a, T2 b) {
  if (a < b)
    a = b;
}
#define files(FILENAME)                                                        \
  read(FILENAME);                                                              \
  write(FILENAME)
#define read(FILENAME) freopen((FILENAME + ".in").c_str(), "r", stdin)
#define write(FILENAME) freopen((FILENAME + ".out").c_str(), "w", stdout)
#define all(c) (c).begin(), (c).end()
#define sz(c) (int)(c).size()
#define left left228
#define right right228
#define y1 y1228
#define mp make_pair
#define pb push_back
#define y2 y2228
const string FILENAME = "input";

vector<int> get(int a, int b, int n) {
  if (n == 1) {
    // cout << a << ' ' << b << endl;
    if (a + b != 1) {
      cout << "NO\n";
      exit(0);
    }
    vector<int> res;
    res.pb(a);
    res.pb(b);
    return res;
  }
  int a1 = 0, b1 = 0;
  int pos = -1;
  vector<int> g;
  for (int i = 0; i < n; i++) {
    if ((a ^ b) & (1 << i)) {
      pos = i;
      int uk = 0;
      for (int j = 0; j < n; j++) {
        if (i != j) {
          if (a & (1 << j)) {
            a1 += 1 << uk;
          }
          if (b & (1 << j)) {
            b1 += 1 << uk;
          }
          g.pb(j);
          uk++;
        }
      }
      break;
    }
  }
  if (pos == -1) {
    cout << "NO\n";
    exit(0);
  }
  vector<int> res1 = get(a1, a1 ^ 1, n - 1);
  vector<int> res2 = get(a1 ^ 1, b1, n - 1);
  vector<int> res;
  for (auto x : res1) {
    int nx = 0;
    for (int f = 0; f < n - 1; f++) {
      if (x & (1 << f)) {
        nx += 1 << g[f];
      }
    }
    if (a & (1 << pos)) {
      nx += 1 << pos;
    }
    res.pb(nx);
  }
  for (auto x : res2) {
    int nx = 0;
    for (int f = 0; f < n - 1; f++) {
      if (x & (1 << f)) {
        nx += 1 << g[f];
      }
    }
    if (b & (1 << pos)) {
      nx += 1 << pos;
    }
    res.pb(nx);
  }
  return res;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  //  read(FILENAME);
  int n, a, b;
  cin >> n >> a >> b;
  vector<int> res = get(a, b, n);
  cout << "YES\n";
  for (auto x : res) {
    cout << x << ' ';
  }
  cout << '\n';
  return 0;
}