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>
#include <bits/stdc++.h>
using namespace std;
char buf[1 << 20], *p1 = buf, *p2 = buf;
template <typename T>
void read(T &x) {
  x = 0;
  bool f = 1;
  char c =
      (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2)
           ? EOF
           : *p1++);
  for (; !isdigit(c);
       c = (p1 == p2 &&
                    (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2)
                ? EOF
                : *p1++))
    if (c == '-') f = 0;
  if (f)
    for (; isdigit(c);
         c = (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin),
                          p1 == p2)
                  ? EOF
                  : *p1++))
      x = x * 10 - 48 + c;
  else
    for (; isdigit(c);
         c = (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin),
                          p1 == p2)
                  ? EOF
                  : *p1++))
      x = x * 10 + 48 - c;
}
template <typename T, typename... Args>
void read(T &t, Args &...args) {
  read(t), read(args...);
}
const int N = 5e3 + 5;
int T, n, m;
int sum, pos, fa[N], dep[N];
void solve() {
  read(n, m);
  for (int i = 2; i <= n; ++i) {
    fa[i] = i >> 1, dep[i] = dep[fa[i]] + 1;
    sum += dep[i];
    if (!(i & i - 1)) pos = i;
  }
  if (m < sum || n * (n - 1) / 2 < m) {
    puts("NO");
    return;
  }
  puts("YES");
  m -= sum;
  for (int i = n; i >= 1; --i)
    if (i & i - 1) {
      if (dep[pos] + 1 - dep[i] < m) {
        m -= dep[pos] + 1 - dep[i];
        fa[i] = pos, dep[i] = dep[pos] + 1, pos = i;
      } else {
        while (dep[pos] + 1 - dep[i] > m) pos = fa[pos];
        if (dep[pos] + 1 != dep[i]) fa[i] = pos;
        break;
      }
    }
  for (int i = 2; i <= n; ++i) printf("%d ", fa[i]);
  putchar(10);
}
int main() {
  read(T);
  while (T--) {
    sum = 0, pos = 1;
    solve();
  }
  return 0;
}
