#include<iostream>
#include<vector>
#include<cmath>
using std::vector;
using std::cin;
using std::cout;
using std::endl;
int main()
{
int iHeight = 0;
int iBallNum = 0;
long iNodeNum = 0;
int iCurIndex = 1;
while(cin>>iHeight && cin>>iBallNum)
{
iNodeNum = static_cast<long>(pow(2.0,iHeight) - 1);
iCurIndex = 1;
long lCurNodeBallNum = iBallNum - 1;//倒数第二次的开关状态,决定最后一次落向
for(int iLayer = 1; iLayer != iHeight; iLayer++)
{
if(lCurNodeBallNum % 2 ==0)// 该节点球落了iBallNum次,开关应该是初始状态关闭。左边孩子
{
iCurIndex = iCurIndex * 2;
lCurNodeBallNum = lCurNodeBallNum / 2; //落在左孩子上面球的次数
}
else //open
{
iCurIndex = iCurIndex * 2 + 1; //落在右边孩子上面的球次数
lCurNodeBallNum = lCurNodeBallNum / 2;
}
}
cout<<iCurIndex<<endl;
}
return 0;
}