← Home
```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")
		}
	}
}
```