using System; using static System.Console; using System.Linq; using System.Collections.Generic; using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.Intrinsics.X86; class Program { static int NN => int.Parse(ReadLine()); static long[] NList => ReadLine().Split().Select(long.Parse).ToArray(); public static void Main() { Solve(); } static void Solve() { var t = NN; var ans = new long[t]; for (var u = 0; u < t; ++u) { var c = NList; ans[u] = Move(c[0], c[1]); } WriteLine(string.Join("\n", ans)); } static long Move(long m, long d) { --d; var end = 0; for (var i = 61; i >= 0; --i) { if ((m >> i) != 0) { end = i; break; } } var ans = 0L; for (var i = end - 1; i > d; --i) { if (((m >> i) & 1) == 0) { var cur = m; var pos = (int)d; while (pos < i) { if (((cur >> pos + 1) & 1) == 1) { var next = cur + 1; if (((next >> pos + 1) & 1) == 1) { ++pos; ++ans; cur = next; // WriteLine($"to {next}, {pos}"); } else { ++pos; ++ans; // WriteLine($"to {cur}, {pos}"); } } else { var next = NextOne(pos + 1, cur); ++pos; ans += next - cur; cur = next; // WriteLine($"to {next}, {pos}"); } } return ans + cur - 1; } } return m - 1; } static long max = (1L << 62) - 1; static long NextOne(int d, long org) { var next = org + 1; if (((next >> d) & 1) == 1) return next; return (org & (max ^ ((1L << d + 1) - 1))) | (1L << d); } }