N,X=list(map(int,input().split()))



# レベル0バーガーの厚さ：1

# レベルLバーガーの厚さ：A(L-1) * 2 + 3



# レベル0バーガーのパティの数：1

# レベルLバーガーのパティの数：P(L-1) * 2 + 1



a=[1]

p=[1]

for i in range(N):

  a+=[a[i]*2+3]

  p+=[p[i]*2+1]

  

def search(n,x):

  if n==0:

    return (1,0)[x<=0]

  elif x<=1+a[n-1]:

    return search(n-1,x-1)

  else:

    return p[n-1]+1+search(n-1,x-2-a[n-1])

  

print((search(N,X)))

import sys

readline = sys.stdin.readline



N,X = list(map(int,readline().split()))



# レベルNバーガーの厚さ = (レベルN - 1バーガーの厚さ) * 2 + 3

# レベル1〜Nの厚さを先に求めておく



T = [1] * (N + 1)

for i in range(1, len(T)):

  T[i] = T[i - 1] * 2 + 3



# レベルNバーガーをX枚目まで食べたとき、パティを何枚食べるか

# レベルN - 1バーガーの厚さをtとする

# X = 1 : 0枚

# X <= t + 1 : レベルN - 1バーガーのX - 1枚目まで

# X = t + 2 : レベルN - 1バーガーのt枚目まで + 1

# X < t * 2 + 3 : レベルN - 1バーガーのすべてと、1枚と、レベルN - 1バーガーのX - (t + 2)枚目まで

# X = t : レベルN - 1バーガーのすべて * 2 + 1



def bargar(n,x):

  if n == 1:

    return min(x - 1, 3)

  t = T[n - 1] # レベルNバーガーの厚さ

  if x == 1:

    return 0

  elif x <= t + 1:

    return bargar(n - 1, x - 1)

  elif x == t + 2:

    return bargar(n - 1, t) + 1

  elif x < t * 2 + 3:

    return bargar(n - 1,t) + 1 + bargar(n - 1, x - (t + 2))

  else:

    return bargar(n - 1,t) * 2 + 1



print((bargar(N,X)))
N, X = list(map(int, input().split()))
# レベル0バーガーの厚さ：1
# レベルLバーガーの厚さ：A(L-1) * 2 + 3
# レベル0バーガーのパティの数：1
# レベルLバーガーのパティの数：P(L-1) * 2 + 1
a = [1]
p = [1]
for i in range(N):
    a += [a[i] * 2 + 3]
    p += [p[i] * 2 + 1]


def search(n, x):
    if n == 0:
        return (1, 0)[x <= 0]
    elif x <= 1 + a[n - 1]:
        return search(n - 1, x - 1)
    else:
        return p[n - 1] + 1 + search(n - 1, x - 2 - a[n - 1])


print((search(N, X)))

import sys

readline = sys.stdin.readline
N, X = list(map(int, readline().split()))
# レベルNバーガーの厚さ = (レベルN - 1バーガーの厚さ) * 2 + 3
# レベル1〜Nの厚さを先に求めておく
T = [1] * (N + 1)
for i in range(1, len(T)):
    T[i] = T[i - 1] * 2 + 3
# レベルNバーガーをX枚目まで食べたとき、パティを何枚食べるか
# レベルN - 1バーガーの厚さをtとする
# X = 1 : 0枚
# X <= t + 1 : レベルN - 1バーガーのX - 1枚目まで
# X = t + 2 : レベルN - 1バーガーのt枚目まで + 1
# X < t * 2 + 3 : レベルN - 1バーガーのすべてと、1枚と、レベルN - 1バーガーのX - (t + 2)枚目まで
# X = t : レベルN - 1バーガーのすべて * 2 + 1
def bargar(n, x):
    if n == 1:
        return min(x - 1, 3)
    t = T[n - 1]  # レベルNバーガーの厚さ
    if x == 1:
        return 0
    elif x <= t + 1:
        return bargar(n - 1, x - 1)
    elif x == t + 2:
        return bargar(n - 1, t) + 1
    elif x < t * 2 + 3:
        return bargar(n - 1, t) + 1 + bargar(n - 1, x - (t + 2))
    else:
        return bargar(n - 1, t) * 2 + 1


print((bargar(N, X)))

-N, X = list(map(int, input().split())) -# レベル0バーガーの厚さ：1 -# レベルLバーガーの厚さ：A(L-1) * 2 + 3 -# レベル0バーガーのパティの数：1 -# レベルLバーガーのパティの数：P(L-1) * 2 + 1 -a = [1] -p = [1] -for i in range(N): -    a += [a[i] * 2 + 3] -    p += [p[i] * 2 + 1] +import sys + +readline = sys.stdin.readline +N, X = list(map(int, readline().split())) +# レベルNバーガーの厚さ = (レベルN - 1バーガーの厚さ) * 2 + 3 +# レベル1〜Nの厚さを先に求めておく +T = [1] * (N + 1) +for i in range(1, len(T)): +    T[i] = T[i - 1] * 2 + 3 +# レベルNバーガーをX枚目まで食べたとき、パティを何枚食べるか +# レベルN - 1バーガーの厚さをtとする +# X = 1 : 0枚 +# X <= t + 1 : レベルN - 1バーガーのX - 1枚目まで +# X = t + 2 : レベルN - 1バーガーのt枚目まで + 1 +# X < t * 2 + 3 : レベルN - 1バーガーのすべてと、1枚と、レベルN - 1バーガーのX - (t + 2)枚目まで +# X = t : レベルN - 1バーガーのすべて * 2 + 1 +def bargar(n, x): +    if n == 1: +        return min(x - 1, 3) +    t = T[n - 1]  # レベルNバーガーの厚さ +    if x == 1: +        return 0 +    elif x <= t + 1: +        return bargar(n - 1, x - 1) +    elif x == t + 2: +        return bargar(n - 1, t) + 1 +    elif x < t * 2 + 3: +        return bargar(n - 1, t) + 1 + bargar(n - 1, x - (t + 2)) +    else: +        return bargar(n - 1, t) * 2 + 1 -def search(n, x): -    if n == 0: -        return (1, 0)[x <= 0] -    elif x <= 1 + a[n - 1]: -        return search(n - 1, x - 1) -    else: -        return p[n - 1] + 1 + search(n - 1, x - 2 - a[n - 1]) - - -print((search(N, X))) +print((bargar(N, X)))