using System;
using System.Text;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using static System.Console;
using static System.Math;

namespace AtCoder
{
    class Program
    {
        static void Main(string[] args)
        {
            new Program().Solve(new ConsoleInput(Console.In, ' '));
#if DEBUG
            ReadLine();
#endif
        }

        void Solve(ConsoleInput cin)
        {
            long n = cin.ReadLong;
            long x = cin.ReadLong;

            // N層の枚数
            long[] num = new long[n + 1];
            // N層のパティの枚数
            long[] pNum = new long[n + 1];

            num[0] = 1;
            pNum[0] = 1;
            for (int i = 1; i <= n; i++)
            {
                num[i] = num[i - 1] * 2 + 3;
                pNum[i] = pNum[i - 1] * 2 + 1;
            }

            long eat = 0;

            EatLN(n, x, ref eat, num, pNum);

            Console.WriteLine(eat);
        }

        long EatLN(long n, long c, ref long eat, long[] num, long[] pNum)
        {
            // 1次元
            if (n == 1)
            {
                return EatL1(c, ref eat);
            }

            // 食べる枚数残り1枚以下
            if (c <= 1)
            {
                return 0;
            }

            if (num[n] <= c)
            {
                // 食べる枚数が現在の層の枚数以上
                eat += pNum[n];
                return c - num[n];
            }
            else
            {
                // 1枚目
                long remain = c - 1;

                // L(n-1)次元
                remain = EatLN(n - 1, remain, ref eat, num, pNum);

                // P
                if (remain > 0)
                {
                    remain -= 1;
                    eat += 1;
                }

                // L(n-1)次元
                remain = EatLN(n - 1, remain, ref eat, num, pNum);

                // 最後
                remain -= 1;

                return remain;
            }
        }
        long EatL1(long c, ref long eat)
        {
            if (c <= 1)
            {
                return 0;
            }
            else if (c <= 4)
            {
                eat += c - 1;
                return 0;
            }
            else
            {
                eat += 3;
                return c - 5;
            }
        }

        class ConsoleInput
        {
            private readonly System.IO.TextReader _stream;
            private char _separator = ' ';
            private Queue<string> inputStream;

            public ConsoleInput(System.IO.TextReader stream, char separator = ' ')
            {
                this._separator = separator;
                this._stream = stream;
                inputStream = new Queue<string>();
            }

            public string Read
            {
                get
                {
                    if (inputStream.Count != 0) return inputStream.Dequeue();
                    string[] tmp = _stream.ReadLine().Split(_separator);
                    for (int i = 0; i < tmp.Length; ++i)
                        inputStream.Enqueue(tmp[i]);
                    return inputStream.Dequeue();
                }
            }

            public string ReadLine { get { return _stream.ReadLine(); } }
            public int ReadInt { get { return int.Parse(Read); } }
            public long ReadLong { get { return long.Parse(Read); } }
            public double ReadDouble { get { return double.Parse(Read); } }
            public string[] ReadStrArray(long N) { var ret = new string[N]; for (long i = 0; i < N; ++i) ret[i] = Read; return ret; }
            public int[] ReadIntArray(long N) { var ret = new int[N]; for (long i = 0; i < N; ++i) ret[i] = ReadInt; return ret; }
            public long[] ReadLongArray(long N) { var ret = new long[N]; for (long i = 0; i < N; ++i) ret[i] = ReadLong; return ret; }
        }
    }
}


Measured memory_bytes: 13268