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.OutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Scanner;

/**
 * Built using CHelper plug-in
 * Actual solution is at the top
*/public class Main {
	public static void main(String[] args) {
		InputStream inputStream = System.in;
		OutputStream outputStream = System.out;
		Scanner in = new Scanner(inputStream);
		PrintWriter out = new PrintWriter(outputStream);
		TaskD solver = new TaskD();
		solver.solve(1, in, out);
		out.close();
	}
static class TaskD   {
int N;
long X;
long sum = 0;

public void solve(int testNumber, Scanner in, PrintWriter out) {
        N = in.nextInt();
        X = in.nextLong();
        long max = 1;
        for(int i=0; i<=N-1; i++){
            max = max*2 + 3;
        }
        dfs(1, max, N);
        out.println(sum);
    }

void dfs(long i1, long i2, int d) {
        if (d == 0) {
            if(i1 <= X){
                sum++;
            }
            return;
        }
        long mid = (i1 + i2)/2;
        if (mid <= X) {
            sum++;
            dfs(mid+1, i2-1, d-1);
            for(int i=0; i<=d-1; i++){
                sum+=pow(2, i);
            }
        } else {
            dfs(i1+1, mid-1, d-1);
        }
    }

public   static long pow(long x, long n) {
        long sum = 1;
        while (n > 0) {
            if ((n & 1) == 1) {
                sum *= x;
            }
            x *= x;
            n >>= 1;
        }
        return sum;
    }

}
}

