#include <bits/stdc++.h>
using namespace std;
struct Node {
  int num, cnt;
  friend bool operator<(const Node &n1, const Node &n2) {
    if (n1.cnt != n2.cnt)
      return n1.cnt < n2.cnt;
    else
      return n1.num < n2.num;
  }
};
set<Node> cur, tmp;
vector<int> xx, num;
map<int, int> mp;
int main() {
  int n, x;
  scanf("%d%d", &n, &x);
  if (x == 0 && n == 2) {
    puts("NO");
    return 0;
  }
  while (x > 0) {
    xx.push_back(x % 2);
    x /= 2;
  }
  int sz = xx.size();
  int pre = 0;
  cur.insert({0, n});
  int idx = 0;
  while (true) {
    int need;
    if (idx < sz) {
      need = xx[idx];
    } else
      need = 0;
    tmp.clear();
    int tar = need, now = 0;
    for (auto o : cur) {
      int zc = o.num * 2, cc = o.cnt;
      if (cc / 2 > 0) tmp.insert({zc + 1, cc / 2});
      if ((cc + 1) / 2 > 0) tmp.insert({zc, (cc + 1) / 2});
      now ^= ((cc / 2) % 2);
    }
    if (tar != now) {
      for (auto o : cur) {
        int zc = o.num * 2, cc = o.cnt;
        if (cc == 1) {
          tmp.erase({zc, (cc + 1) / 2});
          tmp.insert({zc + 1, cc / 2 + 1});
        } else {
          tmp.erase({zc, (cc + 1) / 2});
          tmp.erase({zc + 1, cc / 2});
          if ((cc + 1) / 2 > 1) tmp.insert({zc, (cc + 1) / 2 - 1});
          tmp.insert({zc + 1, cc / 2 + 1});
        }
        break;
      }
    }
    cur.clear();
    for (auto o : tmp) {
      cur.insert(o);
    }
    idx++;
    int siz = cur.size();
    if (siz == n && idx >= sz) break;
  }
  vector<int> ans;
  bool ok = true;
  for (auto o : cur) {
    int t = o.num, res = 0;
    for (int i = 1; i <= idx; i++) {
      int now = t % 2;
      res = res * 2 + now;
      t /= 2;
    }
    ans.push_back(res);
    if (res > 1000000) {
      ok = false;
      break;
    }
  }
  if (!ok) {
    puts("NO");
  } else {
    int ord = 0;
    puts("YES");
    for (auto o : ans) {
      if (ord != 0) putchar(' ');
      printf("%d", o);
      ord++;
    }
    puts("");
  }
  return 0;
}
