// Problem: 1080_D. Olya and magical square
// Time complexity: logn
import java.util.*;
import java.io.*;

// Solution

public class Main 
{    
  public static void main (String[] argv)
  {
	  new Main();
  } 
     
     
  
  boolean test = false;  
  
  final int MOD = 998244353;
  
  
  
  
  public Main()   {
	 FastReader in = new FastReader(new BufferedReader(new InputStreamReader(System.in)));
	 //FastReader in = new FastReader(new BufferedReader(new FileReader("Main.in")));
     final int N = 50; //big enough 
     long[] f = new long[N];
     int maxN = 50;
     f[0] = 0;
     for (int i = 1; i < N; i++) {
         if (Long.MAX_VALUE / 4 <= f[i-1]) {
             maxN = i - 1;
             break;
         }
         f[i] = f[i-1] * 4 + 1;
     }
     
     long[] a = new long[N];
     long[] b = new long[N];
          
     int nt = in.nextInt();     
     
     for (int ii = 1; ii <= nt; ii++) {
         int n = in.nextInt(); 
         long k = in.nextLong(); 
         
         if (k == 0) {
             System.out.println("YES " + n);
             continue;
         }
         
         if (n - 1> maxN || k <= 1 + f[n-1]) {
             System.out.println("YES " + (n - 1));
             continue;
         }
         if (n - 1 == maxN) {
             System.out.println("YES " + (n - 2));
             continue;
         }
         
         // now: n <= maxN
         if (k > f[n]) {
             System.out.println("NO");             
             continue;
         }                 
         
         if (n == 2) {
             if (k==3) System.out.println("NO");
             else System.out.println("YES 0");             
             continue;
         }
         
         a[1] = 1;
         b[1] = f[n-1];
         int ret = 0;
         for (int i = 2; i <= n; i++) {
             a[i] = a[i-1] + (1L << i) - 1;
             b[i] = b[i-1] + (2 * (1L << i) - 3) * f[n-i];
             if (a[i] + b[i] >= k) {
                 ret = n - i;
                 break;
             }
         }
         System.out.println("YES " + ret);
     }
  }
  
  
  private int dist(int x, int y, int xx, int yy) {
      return abs(x - xx) + abs(y - yy);
  }
  
  private boolean less(int x, int y, int xx, int yy) {
      return x < xx || y > yy;
  }
  
  private int mul(int x, int y) {
      return (int)(1L * x * y % MOD);
  }
  
  private int add(int x, int y) {
      return (x + y) % MOD;
  }
  
 
  
  private int nBit1(int v) {
      int v0 = v;
      int c = 0;
      while (v != 0) {
          ++c;
          v = v & (v - 1);
      }
      return c;
  }
  
  private long abs(long v) {
      return v > 0 ? v : -v;
  }
  
  private int abs(int v) {
      return v > 0 ? v : -v;
  }
  
  private int common(int v) {
      int c = 0;
      while (v != 1) {
          v = (v >>> 1);
          ++c;
      }
      
      return c;
  }
  
  private void reverse(char[] a, int i, int j) {
      while (i < j) {
          swap(a, i++, j--);
      }
  }
  
  private void swap(char[] a, int i, int j) {
      char t = a[i];
      a[i] = a[j];
      a[j] = t;
  }
  
  private int gcd(int x, int y) {
      if (y == 0) return x;
      return gcd(y, x % y);
  }
  private long gcd(long x, long y) {
      if (y == 0) return x;
      return gcd(y, x % y);
  }
  private int max(int a, int b) {
      return a >  b ? a : b;
  }
  
  private long max(long a, long b) {
      return a >  b ? a : b;
  }
  
  private int min(int a, int b) {
      return a >  b ? b : a;
  }
  
  private long min(long a, long b) {
      return a >  b ? b : a;
  }
  
  static class FastReader
    {
        BufferedReader br;
        StringTokenizer st;
 
        public FastReader(BufferedReader in)
        {            
            br = in;
        }
 
        String next()
        {
            while (st == null || !st.hasMoreElements())
            {
                try
                {
                    String line = br.readLine();
                    if (line == null || line.length() == 0) return "";
                    st = new StringTokenizer(line);
                }
                catch (IOException  e)
                {
                    return "";
                    //e.printStackTrace();
                }
            }
            return st.nextToken();
        }
 
        int nextInt()
        {
            return Integer.parseInt(next());
        }
 
        long nextLong()
        {
            return Long.parseLong(next());
        }
 
        double nextDouble()
        {
            return Double.parseDouble(next());
        }
 
        String nextLine()
        {
            String str = "";
            try
            {
                str = br.readLine();
            }
            catch (IOException e)
            {
                return "";
                //e.printStackTrace();
            }
            return str;
        }
    }
}