import std; void main () { int T = readln.chomp.to!int; foreach (_; 0..T) { long x; int y; readln.read(x, y); solve(x, y); } } void solve (long x, int y) { byte[64] bit; bit[] = 0; // x を2進数変換 int i = 0; long base = 2; do { bit[i] = cast(byte) (x % base); x /= base; i++; } while (x != 0); /* visualize bit.each!(a => write(a)); write("\n"); */ // yからたどれる一番右に行く while (true) { if (bit[y+1] == 0) { break; } y++; } // 最大高さyであるような連結成分を出力 int res = 0; while (y >= 0) { res += pow(2, y); y--; } // output writeln(res); } void read(T...)(string S, ref T args) { auto buf = S.split; foreach (i, ref arg; args) { arg = buf[i].to!(typeof(arg)); } }