Problem:
Score : 400 points

Problem Statement

In some other world, today is Christmas.

Mr. Takaha decides to make a multi-dimensional burger in his party. A level-L burger (L is an integer greater than or equal to 0) is the following thing:

A level-0 burger is a patty.

A level-L burger (L \geq 1) is a bun, a level-(L-1) burger, a patty, another level-(L-1) burger and another bun, stacked vertically in this order from the bottom.

For example, a level-1 burger and a level-2 burger look like BPPPB and BBPPPBPBPPPBB (rotated 90 degrees), where B and P stands for a bun and a patty.

The burger Mr. Takaha will make is a level-N burger. Lunlun the Dachshund will eat X layers from the bottom of this burger (a layer is a patty or a bun). How many patties will she eat?

Constraints

1 \leq N \leq 50

1 \leq X \leq ( the total number of layers in a level-N burger )

N and X are integers.

Input

Input is given from Standard Input in the following format:

N X

Output

Print the number of patties in the bottom-most X layers from the bottom of a level-N burger.

Sample Input 1

2 7

Sample Output 1

4

There are 4 patties in the bottom-most 7 layers of a level-2 burger (BBPPPBPBPPPBB).

Sample Input 2

1 1

Sample Output 2

0

The bottom-most layer of a level-1 burger is a bun.

Sample Input 3

50 4321098765432109

Sample Output 3

2160549382716056

A level-50 burger is rather thick, to the extent that the number of its layers does not fit into a 32-bit integer.

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;

namespace AtCoder
{
    class Program
    {
        static long patties;
   
        static void Main(string[] args)
        {
            //[summary]D - Christmas
            var line = ReadLine();
            int n = (int)line[0];
            long x = line[1];

            var burgers = CreateBurgers(n);

            CountPatties(burgers, n, x);
            Console.WriteLine(patties);            
        }

        static void CountPatties(List<Burger> burgers, int n, long x)
        {
            long a = burgers[n].Size;
            long b = burgers[n - 1].Size + 2;

            if (x == a | x == a - 1)
            {
                patties += burgers[n].Patties;
            }
            else if (x > b)
            {
                patties += burgers[n - 1].Patties + 1;
                CountPatties(burgers, n - 1, x - b);
            }
            else if (x == b)
            {
                patties += burgers[n - 1].Patties + 1;
            }
            else if (x == b - 1)
            {
                patties += burgers[n - 1].Patties;
            }
            else if (x > 1)
            {
                CountPatties(burgers, n - 1, x - 1);
            }
        }
        
        static List<Burger> CreateBurgers(int n)
        {
            var burgers = new List<Burger>();

            //レベル0バーガーを追加
            burgers.Add(new Burger(1, 1));
            
            for(int i = 0; i < n; i++)
            {
                long size = burgers[i].Size * 2 + 3;
                long patties = burgers[i].Patties * 2 + 1;

                var burger = new Burger(size, patties);
                burgers.Add(burger);
            }

            return burgers;
        }

        //static string CreateBurger(int n)
        //{
        //    string burger = "P";

        //    for(int i = 0; i < n; i++)
        //    {
        //        burger = "B" + burger + "P" + burger + "B";
        //    }

        //    return burger;
        //}

        static List<long> ReadLine()
        {
            var line = Console.ReadLine().TrimEnd();
            var array = line.Split(' ');
            var numbers = new List<long>();

            foreach (var s in array)
            {
                long num = long.Parse(s);
                numbers.Add(num);
            }

            return numbers;
        }
    }

    struct Burger
    {
        public long Size { set; get; }
        public long Patties { set; get; }

        public Burger(long size, long patties)
        {
            Size = size;
            Patties = patties;
        }
    }
}