//给一颗深度为H的满二叉树,从根节点开始,按照LRLRLR……的访问顺序依次访问结点,问访问到最后一层的第N个结点(出口)时,共访问了多少个结点。

//分两种情况考虑:
//1、如果在第h层向左(右)走,而出口位于当前结点的右(左)子树时,需把当前结点的左(右)子树的所有结点全部访问才能访问其右(左)子树。
//2、如果在第h层左(右)走,出口位于当前结点的左(右)子树,则问题转化为深度为H-h的同类问题,显然是一个递归的过程。
#include<bits/stdc++.h>
using namespace std;
typedef __int64 LL;
int H;
LL dfs(int h,LL n,bool f)//当前层数、深度为H-h的树中出口的位置、标志方向
{
if(h==H) return 0;
if(f==0) //当前层左走
{
if(n>(1LL<<(H-h-1)))//出口位于右子树
return (1LL<<(H-h))+dfs(h+1,n-(1LL<<(H-h-1)),0);
return 1+dfs(h+1,n,1);//左子树
}
else //右走
{
if(n>(1LL<<(H-h-1))) return 1+dfs(h+1,n-(1LL<<(H-h-1)),0);
return (1LL<<(H-h))+dfs(h+1,n,1);
}
}
int main()
{
LL N;
cin>>H>>N;
cout<<dfs(0,N,0)<<endl;
return 0;
}

//分两种情况考虑:
//1、如果在第h层向左(右)走,而出口位于当前结点的右(左)子树时,需把当前结点的左(右)子树的所有结点全部访问才能访问其右(左)子树。
//2、如果在第h层左(右)走,出口位于当前结点的左(右)子树,则问题转化为深度为H-h的同类问题,显然是一个递归的过程。
#include<bits/stdc++.h>
using namespace std;
typedef __int64 LL;
int H;
LL dfs(int h,LL n,bool f)//当前层数、深度为H-h的树中出口的位置、标志方向
{
if(h==H) return 0;
if(f==0) //当前层左走
{
if(n>(1LL<<(H-h-1)))//出口位于右子树
return (1LL<<(H-h))+dfs(h+1,n-(1LL<<(H-h-1)),0);
return 1+dfs(h+1,n,1);//左子树
}
else //右走
{
if(n>(1LL<<(H-h-1))) return 1+dfs(h+1,n-(1LL<<(H-h-1)),0);
return (1LL<<(H-h))+dfs(h+1,n,1);
}
}
int main()
{
LL N;
cin>>H>>N;
cout<<dfs(0,N,0)<<endl;
return 0;
}