#include <bits/stdc++.h>
using namespace std;
int64_t N, S;
int64_t find_minimum(int K, vector<int>& parent, vector<int>& depth) {
  int64_t ret = 1;
  queue<int> que;
  depth[0] = 1;
  que.push(0);
  int i = 1;
  while (i < N) {
    int v = que.front();
    que.pop();
    for (int t = 0; t < K && i < N; t++, i++) {
      parent[i] = v;
      depth[i] = depth[v] + 1;
      ret += depth[i];
      que.push(i);
    }
  }
  return ret;
}
int main() {
  cin >> N >> S;
  int64_t UB = N * (N + 1) / 2, LB = 2 * N - 1;
  if (S < LB || UB < S) {
    cout << "No" << endl;
    return 0;
  }
  int ng = 0, ok = N - 1;
  vector<int> parent(N, 0), depth(N, 0);
  while (ok - ng > 1) {
    int mid = (ok + ng) / 2;
    int64_t result = find_minimum(mid, parent, depth);
    (result <= S ? ok : ng) = mid;
  }
  int64_t result = find_minimum(ok, parent, depth);
  vector<int> num_child(N, 0);
  for (int i = 1; i < N; i++) num_child[parent[i]]++;
  priority_queue<pair<int, int>> leaves;
  for (int i = 1; i < N; i++)
    if (num_child[i] == 0) leaves.push({depth[i], i});
  int top = leaves.top().second;
  leaves.pop();
  while (result < S) {
    int leaf = leaves.top().second;
    leaves.pop();
    int par = parent[leaf];
    int gain = depth[top] - depth[par];
    if (gain <= S - result) {
      depth[leaf] = depth[top] + 1;
      num_child[par]--;
      if (num_child[par] == 0) leaves.push({depth[par], par});
      parent[leaf] = top;
      top = leaf;
      result += gain;
    } else {
      for (int i = 1; i < N; i++) {
        if (leaf != i && depth[i] - depth[par] == S - result) {
          parent[leaf] = i;
          result = S;
          break;
        }
      }
    }
  }
  cout << "Yes" << endl;
  for (int i = 1; i < N; i++) cout << parent[i] + 1 << " \n"[i == N - 1];
  return 0;
}
