#include <bits/stdc++.h>
using namespace std;
template <class T>
int getbit(T s, int i) {
  return (s >> i) & 1;
}
template <class T>
T onbit(T s, int i) {
  return s | (T(1) << i);
}
template <class T>
T offbit(T s, int i) {
  return s & (~(T(1) << i));
}
template <class T>
int cntbit(T s) {
  return __builtin_popcount(s);
}
template <class T>
T gcd(T a, T b) {
  T r;
  while (b != 0) {
    r = a % b;
    a = b;
    b = r;
  }
  return a;
}
template <class T>
T lcm(T a, T b) {
  return a / gcd(a, b) * b;
}
long long n, s;
vector<int> V[300005];
int dad[300005];
long long TT(long long x) { return x * (x + 1) / 2; }
long long tinh_max(long long d) {
  long long have = n;
  long long val = 1, res = 0;
  for (long long i = 1;; i++) {
    if (!have) break;
    long long A = min(val, have);
    have -= A;
    res += A * i;
    val *= d;
  }
  return res;
}
void cal(long long d) {
  long long have = n - 1;
  s -= (n);
  long long val = d;
  V[1].push_back(1);
  for (long long dep = 2;; dep++) {
    if (have == 0) break;
    int cur = 0;
    for (int i = n - have + 1; i <= n && i <= n - have + val; i++) {
      if (TT(n - i + 1) >= s) {
        V[dep].push_back(i);
        dad[i] = V[dep - 1][cur];
        cur++;
        if (cur >= ((int)(V[dep - 1]).size())) cur = 0;
        s--;
      }
    }
    have -= ((int)(V[dep]).size());
    s -= have;
    val = ((int)(V[dep]).size()) * d;
  }
}
void solve() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n >> s;
  if (s > (n * (n + 1)) / 2 || s < n + n - 1) {
    cout << "No" << endl;
    return;
  }
  cout << "Yes" << endl;
  for (int i = (1); i <= (n); ++i)
    if (tinh_max(i) <= s) {
      cal(i);
      for (int i = (2); i <= (n); ++i) {
        cout << dad[i];
        if (i == n)
          cout << endl;
        else
          cout << " ";
      }
      return;
    }
}
int main() {
  solve();
  return 0;
}
