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.

Examples

Input

2 7


Output

4


Input

1 1


Output

0


Input

50 4321098765432109


Output

2160549382716056
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;

public class Main {

  static int mod = 1000000007;

  public static void main(String[] args) throws FileNotFoundException {

   // Scanner cin = new Scanner(new FileReader("input.txt"));
   Scanner cin = new Scanner(System.in);

    int n = cin.nextInt();
    double x = cin.nextDouble();

    double[] burgur = new double[n];
    double[] patty = new double[n];
    burgur[0] = 5;
    patty[0] = 3;
    for (int i=1;i<n;i++) {
      burgur[i] = burgur[i-1]*2+3;
      patty[i] = patty[i-1]*2+1;
    }
    int pos = 0;

    double res = findRes(n, x, burgur, patty, 0);
    System.out.println((long)res);

  }

  public static double findRes(int n, double xNum, double[] burger, double[] patty, double eaten) {
    if (n==0) {
      if (xNum==0) return eaten;
      else if (xNum>0&&xNum<4) return eaten+xNum;
      else return eaten+3;
    }
    else {
      if (xNum==0) return eaten;
      else if (xNum>0&&xNum<=burger[n-1]) return eaten+findRes(n-1, xNum-1, burger, patty, eaten);
      else if (xNum == burger[n-1]+1) return eaten+patty[n-1] + 1;
      else if (xNum > burger[n-1]+1&&xNum<=2*burger[n-1]+1)
        return eaten+patty[n-1]+1+ findRes(n-1, xNum-2-burger[n-1], burger, patty, eaten);
      else return eaten + 2*patty[n-1] + 1;
    }
  }


}