#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
const long long Inf = 1e18;
const int N = 1e5 + 10;
const int mod = 0;
int gi() {
  int x = 0, o = 1;
  char ch = getchar();
  while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
  if (ch == '-') o = -1, ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  return x * o;
}
template <typename T>
bool chkmax(T &a, T b) {
  return a < b ? a = b, 1 : 0;
};
template <typename T>
bool chkmin(T &a, T b) {
  return a > b ? a = b, 1 : 0;
};
int add(int a, int b) { return a + b >= mod ? a + b - mod : a + b; }
int sub(int a, int b) { return a - b < 0 ? a - b + mod : a - b; }
void inc(int &a, int b) { a = (a + b >= mod ? a + b - mod : a + b); }
void dec(int &a, int b) { a = (a - b < 0 ? a - b + mod : a - b); }
string to_string(string s) { return '"' + s + '"'; }
string to_string(const char *s) { return to_string((string)s); }
template <typename A, typename B>
string to_string(pair<A, B> p) {
  return "(" + to_string(p.first) + "," + to_string(p.second) + ")";
}
template <typename T>
string to_string(T v) {
  int fst = 1;
  string ret = "{";
  for (auto x : v) {
    if (!fst) ret += ",";
    fst = 0, ret += to_string(x);
  }
  ret += "}";
  return ret;
}
void dbg_out() { cerr << endl; }
template <typename Head, typename... Tail>
void dbg_out(Head H, Tail... T) {
  cerr << " " << to_string(H);
  dbg_out(T...);
}
int n, rem[N], fa[N], vis[N];
long long need;
queue<int> s[N];
set<int> have;
void erase(int i) {
  s[i].pop();
  if (s[i].empty()) have.erase(i);
}
void insert(int i, int x) {
  if (s[i].empty()) have.insert(i);
  s[i].push(x);
}
int check(int mid) {
  for (int i = 1; i <= n; i++) {
    rem[i] = mid - 1, vis[i] = 0;
    while (!s[i].empty()) s[i].pop();
  }
  rem[n] = mid;
  have.clear();
  long long now = 0;
  for (int i = 1; i <= n; i++) {
    now += i, fa[i] = i - 1;
    if (mid != 1) s[i].push(i), have.insert(i);
  }
  if (now < need) return 0;
  now -= need;
  for (int i = n; i; i--) {
    if (now == 0) break;
    if (vis[i]) continue;
    int tmp = max(1ll, i - now - 1);
    auto it = have.lower_bound(tmp);
    if (it == have.end()) return 0;
    int x = *it;
    fa[i] = s[x].front();
    --rem[fa[i]];
    if (!rem[fa[i]]) erase(x);
    vis[fa[i]] = 1;
    erase(i);
    if (i != n) {
      ++rem[i];
    }
    if (rem[i]) insert(x + 1, i);
    now -= i;
    now += x + 1;
  }
  return now == 0;
}
int main() {
  cin >> n >> need;
  int l = 1, r = n, ret = 0;
  while (l <= r) {
    int mid = (l + r) >> 1;
    if (check(mid))
      ret = mid, r = mid - 1;
    else
      l = mid + 1;
  }
  if (!ret)
    puts("No");
  else {
    check(ret);
    puts("Yes");
    for (int i = 2; i <= n; i++) printf("%d ", fa[i]);
  }
  return 0;
}
