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;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const long long base = 1e9 + 7;
const long long oo = 5000 + 10;
const long long gh = 1e3 + 3;
const long long inf = 1e15 + 5;
long long n, m, k, q;
long long a[oo];
long long b[oo];
long long sum[oo];
string s;
char c[oo];
long long lev[oo];
void input() {
  long long x, y, z;
  cin >> n >> m;
  long long t = n * (n - 1) / 2;
  long long k = 0;
  long long T = n - 1;
  x = 2;
  memset(b, 0, sizeof(b));
  memset(lev, 0, sizeof(lev));
  memset(a, 0, sizeof(a));
  long long cur;
  for (long long j = 1; T; j++) {
    if (T <= x) {
      k += j * T;
      b[j] = T;
      T = 0;
    } else {
      k += j * x;
      b[j] = x;
      T -= x;
    }
    cur = j;
    x *= 2;
  }
  if (m >= k && m <= t)
    cout << "YES\n";
  else {
    cout << "NO\n";
    return;
  }
  long long cnt = m - k;
  while (cnt--) {
    while (b[cur] == 1) cur--;
    b[cur]--;
    b[++cur]++;
  }
  long long j = 1;
  cur = 1;
  lev[1] = 1;
  for (long long i = 2; i <= n; i++) {
    if (b[cur]) {
      b[cur]--;
      if (a[j] == 2) j++;
      { a[j]++, cout << j << " "; }
      lev[i] = cur + 1;
    } else {
      cur++;
      while (lev[j] != cur) j++;
      b[cur]--;
      if (a[j] == 2) j++;
      { a[j]++, cout << j << " "; }
      lev[i] = cur + 1;
    }
  }
  cout << "\n";
}
void cre() {}
void solve() { cre(); }
void ouput() {}
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  if (ifstream("test.txt")) {
    freopen("test.txt", "r", stdin);
  } else if (ifstream(""
                      ".inp")) {
    freopen(
        ""
        ".inp",
        "r", stdin);
    freopen(
        ""
        ".out",
        "w", stdout);
  }
  long long t = 1;
  cin >> t;
  while (t--) {
    input();
    solve();
    ouput();
  }
}