```go
package main
import (
"bufio"
"fmt"
"os"
)
const INF int64 = 4e18
func pow2(e int64) int64 {
if e >= 62 {
return INF
}
return 1 << e
}
func pow3(e int64) int64 {
if e >= 40 {
return INF
}
res := int64(1)
for i := int64(0); i < e; i++ {
res *= 3
}
return res
}
func pow4(e int64) int64 {
if e >= 32 {
return INF
}
return 1 << (2 * e)
}
func safeMul(a, b int64) int64 {
if a == 0 || b == 0 {
return 0
}
if a > INF/b {
return INF
}
return a * b
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
scanner.Scan()
t := int64(0)
fmt.Sscan(scanner.Text(), &t)
for i := int64(0); i < t; i++ {
scanner.Scan()
n := int64(0)
fmt.Sscan(scanner.Text(), &n)
scanner.Scan()
k := int64(0)
fmt.Sscan(scanner.Text(), &k)
found := false
ans := int64(0)
maxM := n
if maxM > 60 {
maxM = 60
}
for m := int64(1); m <= maxM; m++ {
s := n - m
minVal := (pow3(m) - 1) / 2
if minVal > k {
continue
}
fourN := pow4(n)
if fourN >= INF {
found = true
ans = s
break
}
twoMp1 := pow2(m + 1)
termA := twoMp1 - 1
fourS := pow4(s)
termB := fourS - 1
term2 := safeMul(termA, termB)
if fourN <= term2 {
continue
}
maxVal := (fourN - term2 - 1) / 3
if k <= maxVal {
found = true
ans = s
break
}
}
if found {
fmt.Fprintln(writer, "YES", ans)
} else {
fmt.Fprintln(writer, "NO")
}
}
}
```