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 JAVA):

Solution:
import java.util.*;
public class main
{
   static Pair[][] p1;
	public static void main(String args[])
	{
		Scanner sc=new Scanner(System.in);
		int nn=Integer.parseInt(sc.nextLine());
		while(nn-->0)
		{
		   
		 //  hash=new Hashtable<>();
		   String hh[]=sc.nextLine().split(" ");
		   int n=Integer.parseInt(hh[0]);
		   int m=Integer.parseInt(hh[1]);
		   p1=new Pair[m+1][n+1];
		   Pair d= dfs(1,1,m,n-1);
		 //  System.out.println(hash);
		   if(d.b.size()==0){System.out.println("NO");}
		   else
		   {
		      System.out.println("YES");
		      int count=0;
		      int k=0;
		      ArrayList<ArrayList<Integer>>arr=new ArrayList<>();
		      for(int i=0;i<d.b.size()+1;i++)
		      {
		         arr.add(new ArrayList<Integer>());
		      }
		      arr.get(0).add(1);
		      int cur=2;
		    //  int k=0;
		      
		      for(int i=0;i<d.b.size();i++)
		      {
		         int child=0;
		         k=0;
		         for(int u=0;u<d.b.get(i);u++)
		         {
		            System.out.print(arr.get(i).get(k)+" ");
		         child+=1;
		         cur+=1;
		         arr.get(i+1).add(cur-1);
		         if(child==2){k+=1;child=0;}}
		         
		      }
		      System.out.println();
		   }
		}
	}
	static Pair dfs(int d, int a, int sum, int count)
	{
	   
	   if(sum==0 && count==0){return new Pair(true,new ArrayList<Integer>());}
	   if(count<0 || sum<0){return new Pair(false,new ArrayList<Integer>());}
	   if(p1[sum][count]!=null){return p1[sum][count];}
	   for(int k=1;k<=2*a;k++)
	   {
	      if((sum-k*d)>=0)
	      {
	        // System.out.println(sum +" "+count+" "+d+" "+a );
	         Pair p=dfs(d+1,k,sum-k*d,count-k);
	         
	         if(p.a)
	         {
	           p.b.add(0,k);
	           p1[sum][count]=new Pair(true,p.b);
	           return new Pair(true,p.b);
	         }
	      }
	   }
	   p1[sum][count]=new Pair(false,new ArrayList<Integer>());
	   return new Pair(false,new ArrayList<Integer>());
	}
}
class Pair
{
   boolean a;
   ArrayList<Integer>b;
   Pair(boolean c, ArrayList<Integer>d)
   {
      a=c;
      b=d;
   }
}