unittest
{
	assert( [ "2 7" ].parse.expand.solve == 4 );
	assert( [ "1 1" ].parse.expand.solve == 0 );
	assert( [ "50 4321098765432109" ].parse.expand.solve == 2160549382716056 );
}



import std.algorithm;
import std.conv;
import std.functional;
import std.math;
import std.range;
import std.stdio;
import std.string;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto nx = input.front.split.to!( long[] );
	return tuple( nx[ 0 ], nx[ 1 ] );
}

long solve( long n, long x )
{
	auto ans = 0L;
	
	// レベルnのときの全層数と全パティ数を計算
	auto tl = memoize!calcTotalLayer( n );
	auto tp = memoize!calcTotalPatty( n );

	// xが全層数以上の場合、食べたパティ数は全パティ数になる。
	if( tl <= x ) return tp;
	
	// xが全層数の半分と等しい場合、食べたパティ数は全パティ数の半分になる。
	auto hl = cast( long ) ceil( tl / 2f );
	if( x == hl ) return cast( long ) ceil( tp / 2f );
	
	// xが全層数の半分より大きい場合、上の層から数えて、全層数から数えた分を引く
	// （こうすると最大でも全層数の半分まで数えれば済むようになる）
	if( hl < x ) return tp - memoize!solve( n, tl - x );
	
	// xが全層数の半分より小さい場合、下の層から数える
	auto l = 0L;
	auto p = 0L;
	
	// バンズ1枚
	l++;
	if( x <= l ) return p;
	
	// レベルn-1バーガー
	p += memoize!solve( n - 1, x - l );
	l += memoize!calcTotalLayer( n - 1 );
	if( x <= l ) return p;
	
	// パティ1枚
	p++;
	l++;
	if( x <= l ) return p;
	
	// レベルn-1バーガー
	p += memoize!solve( n - 1, x - l );
	l += memoize!calcTotalLayer( n - 1 );
	if( x <= l ) return p;
	
	// バンズ1枚
	l++;
	return p;
}

long calcTotalLayer( long n )
{
	if( n == 0 ) return 1;
	else         return memoize!calcTotalLayer( n - 1 ) * 2 + 3;
}

long calcTotalPatty( long n )
{
	if( n == 0 ) return 1;
	else         return memoize!calcTotalPatty( n - 1 ) * 2 + 1;
}
