#include <bits/stdc++.h>
using namespace std;
struct Ans {
  bool ok;
  vector<int> ps;
};
Ans solve(int n, long long need) {
  vector<int> lvl, ps, chs;
  auto placeMin = [&](int brs) {
    long long ans = 1;
    lvl.assign(n, 0);
    ps.assign(n, 0);
    chs.assign(n, 0);
    int u = 0;
    lvl[0] = 1;
    int curBrs = 0;
    for (int v = 1; v < n; v++) {
      if (chs[u] == brs) {
        u++;
      }
      chs[u]++;
      lvl[v] = lvl[u] + 1;
      ans += lvl[v];
      ps[v] = u;
    }
    return ans;
  };
  long long cur;
  auto binSrchBr = [&]() {
    if (placeMin(1) < need || placeMin(n - 1) > need) {
      return -1;
    }
    int l = 1, r = n - 1;
    while (l < r) {
      int mid = (l + r + 1) / 2;
      if (placeMin(mid) >= need) {
        l = mid;
      } else {
        r = mid - 1;
      }
    }
    cur = placeMin(l);
    return l;
  };
  int lowBr = binSrchBr();
  if (lowBr == -1) {
    return {false};
  }
  int brs = lowBr + 1;
  vector<set<int>> levels(n + 1);
  for (int v = 0; v < n; v++) {
    levels[lvl[v]].insert(v);
  }
  int itLvl = 1;
  int v = n - 1;
  while (cur > need) {
    for (int pLvl = itLvl;; pLvl++) {
      assert(pLvl < n);
      auto &st = levels[pLvl];
      if (st.empty()) {
        itLvl++;
        continue;
      }
      int u = *st.begin();
      auto nxtLvl = lvl[u] + 1;
      auto nxt = cur - lvl[v] + nxtLvl;
      if (nxt >= need) {
        chs[u]++;
        if (chs[u] == brs) {
          st.erase(u);
        }
        levels[lvl[v]].erase(v);
        levels[nxtLvl].insert(v);
        lvl[v] = nxtLvl;
        cur = nxt;
        ps[v] = u;
        chs[v] = 0;
        v--;
        break;
      }
    }
  }
  assert(cur == need);
  return {true, ps};
}
void test() {
  auto res1 = solve(3, 5);
  vector<int> expected1 = {0, 0, 0};
  assert(res1.ok && res1.ps == expected1);
  assert(!solve(4, 42).ok);
  auto res2 = solve(6, 15);
  vector<int> expected2 = {0, 0, 1, 2, 1, 0};
  assert(res2.ok && res2.ps == expected2);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  test();
  long long need;
  int n;
  cin >> n >> need;
  auto ans = solve(n, need);
  cout << (ans.ok ? "Yes" : "No") << endl;
  if (ans.ok) {
    for (int v = 1; v < n; v++) {
      cout << ans.ps[v] + 1 << " ";
    }
    cout << endl;
  }
}
