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 long long base = 233;
const long long ff = 2e6 + 1;
const long long mod = 998244353;
const long long inf = 1e9 + 1;
long long n, d, dep[5001], dfn[ff], f[ff], mul[ff];
long long vs[5001][5001], ss[5001];
void init() {
  memset(dep, 0, sizeof(dep));
  memset(ss, 0, sizeof(ss));
  cin >> n >> d;
  long long nn = n;
  if (d > n * (n - 1) / 2) {
    puts("NO");
    return;
  }
  dep[0] = 1;
  nn--;
  long long td = 1, smn = 0;
  while (nn) {
    if (nn > dep[td - 1] * 2)
      dep[td] = dep[td - 1] * 2, nn -= dep[td++];
    else
      dep[td] = nn, nn -= dep[td++];
  }
  td--;
  for (long long i = 0; i <= td; ++i) smn += dep[i] * i;
  if (d < smn) {
    puts("NO");
    return;
  }
  puts("YES");
  long long top = td, ato = td + 1;
  while (1) {
    if (dep[top] == 1) top--;
    if (smn + ato - top > d) break;
    smn += (ato - top);
    dep[ato]++;
    dep[top]--;
    ato++;
  }
  long long dd = d - smn;
  if (dep[top] == 1) top--;
  dep[top]--;
  dep[top + dd]++;
  long long cnt = 0;
  for (long long i = 0; i <= ato - 1; ++i)
    for (long long j = 1; j <= dep[i]; ++j) cnt++, vs[i][ss[i]++] = cnt;
  for (long long i = 1; i <= ato - 1; ++i) {
    for (long long j = 0; j < ss[i]; ++j) f[vs[i][j]] = vs[i - 1][j / 2];
  }
  for (long long i = 2; i <= n; ++i) cout << f[i] << " ";
  puts("");
  for (long long i = 0; i <= ato + ato; ++i) dep[i] = 0, f[i] = 0, ss[i] = 0;
  cnt = 0;
}
signed main() {
  mul[0] = 1;
  for (long long i = 1; i <= 60; ++i) mul[i] = mul[i - 1] << 1;
  long long T = 1;
  cin >> T;
  while (T--) init();
}