/*
*小球下落,根据开关选择向左走,还是向右走,输出第n个球所在结点
*/
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
const int MAXD = 20;
int s[1<<MAXD]; //最大结点个数为2的MAXD次方减1
int main(){
freopen("input.txt","r",stdin);
int D,I; //D为层数,I为球的个数
int k,n; //k 球所在的点,n节点最大数
while(cin>>D>>I){
memset(s,0,sizeof(s));
n = (1<<D)-1; //n=2的n次方减1
for(int i = 0;i < I; i++){
k =1;
while(1){
s[k] = !s[k];
k = s[k] ? 2*k :2*k+1; //根据开关决定下落方向
if(k > n) //越界了
break;
}
}
cout<<k/2<<endl; //输出越界前的球所在叶子编号
}
return 0;
}