import Data.Array

main = do
  li <- getLine
  let [n,x] = map read $ words li
  let ans = compute n x
  print ans

{-
バーガーの厚さは、l0 = 1, ln = 2l(n-1)+3
肉の枚数は、m0 = 1, mn = 2m(n-1)+1
バーガーを素直に配列で作るのは無謀なので、計算で求める。
-}
la = listArray (0,50) $ iterate ((3 +).(2 *)) 1
ma = listArray (0,50) $ iterate (succ .(2 *)) 1

compute :: Int -> Int -> Int
compute n x = burger 0 n x

-- n次元バーガーのx層を食べたときの肉の数 + a
burger a _ 0 = a
burger a n x
  | x <= n = a -- nバーガーの下n枚はバンズ
  | la ! n - x <= n = a + ma ! n -- nバーガーの上n枚はバンズ
  | ln1 >= x1 = burger a n1 x1 -- 下のn-1バーガーの中に納まる
  | x2 == 0   = m1 -- 真ん中の肉まで
  | True      = burger m1 n1 x2 -- ここまでと残り
  where
    x1 = pred x -- 一番下のバンズ
    n1 = pred n
    ln1 = la ! n1
    m1 = a + ma ! n1 + 1
    x2 = x1 - ln1 - 1
