Problem: You are given two integers n and d. You need to construct a rooted binary tree consisting of n vertices with a root at the vertex 1 and the sum of depths of all vertices equals to d.

A tree is a connected graph without cycles. A rooted tree has a special vertex called the root. A parent of a vertex v is the last different from v vertex on the path from the root to the vertex v. The depth of the vertex v is the length of the path from the root to the vertex v. Children of vertex v are all vertices for which v is the parent. The binary tree is such a tree that no vertex has more than 2 children.

You have to answer t independent test cases.

Input

The first line of the input contains one integer t (1 ≤ t ≤ 1000) — the number of test cases.

The only line of each test case contains two integers n and d (2 ≤ n, d ≤ 5000) — the number of vertices in the tree and the required sum of depths of all vertices.

It is guaranteed that the sum of n and the sum of d both does not exceed 5000 (∑ n ≤ 5000, ∑ d ≤ 5000).

Output

For each test case, print the answer.

If it is impossible to construct such a tree, print "NO" (without quotes) in the first line. Otherwise, print "{YES}" in the first line. Then print n-1 integers p_2, p_3, ..., p_n in the second line, where p_i is the parent of the vertex i. Note that the sequence of parents you print should describe some binary tree.

Example

Input


3
5 7
10 19
10 18


Output


YES
1 2 1 3 
YES
1 2 3 3 9 9 2 1 6 
NO

Note

Pictures corresponding to the first and the second test cases of the example:

<image>

<image>

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000500;
inline int g() {
  int x;
  cin >> x;
  return x;
}
inline long long gl() {
  long long x;
  cin >> x;
  return x;
}
inline char gc() {
  char x;
  cin >> x;
  return x;
}
inline string gs() {
  string s;
  cin >> s;
  return s;
}
template <typename T>
inline vector<T> gv(int len) {
  vector<T> a(len);
  for (auto& it : a) cin >> it;
  return a;
}
inline vector<int> gv(int len) {
  vector<int> a(len);
  for (auto& it : a) cin >> it;
  return a;
}
inline vector<pair<int, int>> gv_andPairCnt(int len) {
  vector<pair<int, int>> a(len);
  int i = 1;
  for (auto& it : a) {
    it.second = i;
    i++;
    cin >> it.first;
  }
  return a;
}
double power_log(double power, double val) { return log(val) / log(power); }
template <typename T>
T sqr(T x) {
  return x * x;
}
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& v) {
  for (auto it : v) os << it << ", ";
  os << "\n";
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, const deque<T>& v) {
  os << "deque:{";
  for (auto it : v) os << it << " ";
  os << "}\n";
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, const set<T>& v) {
  os << "set:{";
  for (auto it : v) os << it << " ";
  os << "}\n";
  return os;
}
template <typename T, typename H>
inline vector<pair<T, H>> gv_andBiPair(int len) {
  vector<pair<T, H>> a(len);
  for (auto& it : a) {
    cin >> it.first >> it.second;
  }
  return a;
}
template <typename T>
inline set<T> vector_to_set(const vector<T>& vec) {
  set<T> s;
  for (auto& it : vec) s.insert(it);
  return s;
}
const long long md = 1e9 + 7;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int t = g();
  for (int t1 = 0; t1 < (t); ++t1) {
    int n = g(), d = g();
    vector<int> cnt(n + 3);
    vector<int> p(n + 3);
    vector<int> bad(n + 3);
    vector<int> depth(n + 3);
    depth[1] = 0;
    for (int i = 2; i <= n; i++) {
      p[i] = i - 1;
      cnt[i - 1]++;
      depth[i] = i - 1;
    }
    int k = accumulate(depth.begin(), depth.end(), 0LL);
    int mx_b = 0, pw = 1, c = n;
    for (int de = 0;; de++) {
      mx_b += min(pw, c) * de;
      c -= min(pw, c);
      pw *= 2;
      if (c <= 0) {
        break;
      }
    }
    if (d < mx_b) {
      cout << "NO\n";
      continue;
    }
    while (k > d) {
      int v = -1;
      for (int i = 2; i <= n; i++) {
        if (cnt[i] == 0 && !bad[i]) {
          if (v == -1) {
            v = i;
          } else {
            if (depth[v] > depth[i]) {
              v = i;
            }
          }
        }
      }
      if (v == -1) {
        break;
      }
      bool fl = false;
      for (int i = 1; i <= n; i++) {
        if (i != v && cnt[i] < 2 && depth[i] + 2 == depth[v]) {
          fl = true;
          int pp = p[v];
          cnt[pp]--;
          p[v] = i;
          cnt[i]++;
          depth[v] = depth[i] + 1;
          break;
        }
      }
      if (!fl) {
        bad[v] = true;
        continue;
      }
      k--;
    }
    if (k == d) {
      cout << "YES\n";
      for (int i = 2; i <= n; i++) {
        cout << p[i] << " ";
      }
      cout << "\n";
    } else {
      cout << "NO\n";
    }
  }
}