#include <bits/stdc++.h>
#pragma GCC optimize("O3", "unroll-loops")
#pragma GCC target("avx2")
using namespace std;
template <class T, class U>
inline void checkmin(T &x, U y) {
  if (y < x) x = y;
}
template <class T, class U>
inline void checkmax(T &x, U y) {
  if (y > x) x = y;
}
template <class T, class U>
inline bool ifmax(T &x, U y) {
  if (y > x) return x = y, true;
  return false;
}
template <class T, class U>
inline bool ifmin(T &x, U y) {
  if (y < x) return x = y, true;
  return false;
}
template <class T>
inline void sort(T &a) {
  sort(a.begin(), a.end());
}
template <class T>
inline void rsort(T &a) {
  sort(a.rbegin(), a.rend());
}
template <class T>
inline void reverse(T &a) {
  reverse(a.begin(), a.end());
}
template <class T, class U>
inline istream &operator>>(istream &str, pair<T, U> &p) {
  return str >> p.first >> p.second;
}
template <class T>
inline istream &operator>>(istream &str, vector<T> &a) {
  for (auto &i : a) str >> i;
  return str;
}
template <class T>
inline T sorted(T a) {
  sort(a);
  return a;
}
vector<int> l, r, p;
vector<vector<int>> has, both;
void dfsfind(int v, int h = 0) {
  if (v == -1) return;
  if (l[v] == -1 || r[v] == -1) has[h].push_back(v);
  if (l[v] == -1 && r[v] == -1) both[h].push_back(v);
  dfsfind(l[v], h + 1);
  dfsfind(r[v], h + 1);
}
void solve() {
  int n, d;
  cin >> n >> d;
  int mx = 0, mn = 0;
  for (int i = 0; i < n; ++i) mx += i;
  for (int i = 0; i < n; ++i) {
    int k = i;
    while (k > 0) {
      ++mn;
      k = (k - 1) / 2;
    }
  }
  if (d < mn || d > mx) {
    cout << "NO\n";
    return;
  }
  l = r = p = vector<int>(n, -1);
  for (int i = 1; i < n; ++i) {
    p[i] = (i - 1) / 2;
    if (i & 1)
      l[p[i]] = i;
    else
      r[p[i]] = i;
  }
  while (mn < d) {
    has = both = vector<vector<int>>(n);
    dfsfind(0);
    for (int h = n - 1; h >= 0; --h)
      if (signed(both[h].size()) >= 1 && signed(has[h].size()) >= 2) {
        int v = both[h][0];
        if (l[p[v]] == v)
          l[p[v]] = -1;
        else
          r[p[v]] = -1;
        for (auto u : has[h])
          if (u != v) {
            p[v] = u;
            if (l[u] == -1) {
              l[u] = v;
            } else {
              r[u] = v;
            }
            goto go;
          }
      }
  go:;
    ++mn;
  }
  cout << "YES\n";
  for (int i = 1; i < n; ++i) cout << p[i] + 1 << ' ';
  cout << '\n';
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cout << fixed << setprecision(12);
  srand(94385);
  int t;
  cin >> t;
  while (t--) solve();
  return 0;
}

### Prompt

Please formulate a Cpp solution to the following 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>

### Response

```cpp
#include <bits/stdc++.h>
#pragma GCC optimize("O3", "unroll-loops")
#pragma GCC target("avx2")
using namespace std;
template <class T, class U>
inline void checkmin(T &x, U y) {
  if (y < x) x = y;
}
template <class T, class U>
inline void checkmax(T &x, U y) {
  if (y > x) x = y;
}
template <class T, class U>
inline bool ifmax(T &x, U y) {
  if (y > x) return x = y, true;
  return false;
}
template <class T, class U>
inline bool ifmin(T &x, U y) {
  if (y < x) return x = y, true;
  return false;
}
template <class T>
inline void sort(T &a) {
  sort(a.begin(), a.end());
}
template <class T>
inline void rsort(T &a) {
  sort(a.rbegin(), a.rend());
}
template <class T>
inline void reverse(T &a) {
  reverse(a.begin(), a.end());
}
template <class T, class U>
inline istream &operator>>(istream &str, pair<T, U> &p) {
  return str >> p.first >> p.second;
}
template <class T>
inline istream &operator>>(istream &str, vector<T> &a) {
  for (auto &i : a) str >> i;
  return str;
}
template <class T>
inline T sorted(T a) {
  sort(a);
  return a;
}
vector<int> l, r, p;
vector<vector<int>> has, both;
void dfsfind(int v, int h = 0) {
  if (v == -1) return;
  if (l[v] == -1 || r[v] == -1) has[h].push_back(v);
  if (l[v] == -1 && r[v] == -1) both[h].push_back(v);
  dfsfind(l[v], h + 1);
  dfsfind(r[v], h + 1);
}
void solve() {
  int n, d;
  cin >> n >> d;
  int mx = 0, mn = 0;
  for (int i = 0; i < n; ++i) mx += i;
  for (int i = 0; i < n; ++i) {
    int k = i;
    while (k > 0) {
      ++mn;
      k = (k - 1) / 2;
    }
  }
  if (d < mn || d > mx) {
    cout << "NO\n";
    return;
  }
  l = r = p = vector<int>(n, -1);
  for (int i = 1; i < n; ++i) {
    p[i] = (i - 1) / 2;
    if (i & 1)
      l[p[i]] = i;
    else
      r[p[i]] = i;
  }
  while (mn < d) {
    has = both = vector<vector<int>>(n);
    dfsfind(0);
    for (int h = n - 1; h >= 0; --h)
      if (signed(both[h].size()) >= 1 && signed(has[h].size()) >= 2) {
        int v = both[h][0];
        if (l[p[v]] == v)
          l[p[v]] = -1;
        else
          r[p[v]] = -1;
        for (auto u : has[h])
          if (u != v) {
            p[v] = u;
            if (l[u] == -1) {
              l[u] = v;
            } else {
              r[u] = v;
            }
            goto go;
          }
      }
  go:;
    ++mn;
  }
  cout << "YES\n";
  for (int i = 1; i < n; ++i) cout << p[i] + 1 << ' ';
  cout << '\n';
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cout << fixed << setprecision(12);
  srand(94385);
  int t;
  cin >> t;
  while (t--) solve();
  return 0;
}

```