import std.algorithm;
import std.array;
import std.conv;
import std.math;
import std.range;
import std.stdio;
import std.string;
import std.typecons;

T read(T)() { return readln.chomp.to!T; }
T[] reads(T)() { return readln.split.to!(T[]); }
alias readint = read!int;
alias readints = reads!int;

/// return [P の数, 長さ]
long[] burger(long n) {
    if (n == 0) {
        return [1, 1];
    }

    auto c = burger(n - 1);
    long p = c[0] * 2 + 1;
    long len = c[1] * 2 + 3;
    return [p, len];
}

long calc(long n, long x, long p) {
    // B
    x--;
    if (x == 0) return p;

    // L - 1
    auto c = burger(n - 1);
    if (x < c[1]) { // たべすぎ
        return calc(n - 1, x, p);
    }

    x -= c[1];
    p += c[0];
    if (x == 0) return p;

    // P
    x--;
    p++;
    if (x == 0) return p;

    // L - 1
    if (x < c[1]) { // たべすぎ
        return calc(n - 1, x, p);
    }

    x -= c[1];
    p += c[0];
    if (x == 0) return p;

    // B
    x--;
    if (x == 0) return p;

    return p;
}

void main() {
    auto nx = reads!long;
    long n = nx[0], x = nx[1];
    writeln(calc(n, x, 0));
}
