Buggy python submission (verdict: Runtime Error):
def getItems(layerCount):
	if layerCount == 0:
		return 1
	return 2*getItems(layerCount-1) + 3

def getPats(layerCount):
	return 2**(layerCount + 1) - 1

def patEaten(layer, toEat):
	pattyCount = 0

	if layer == 1:
		burger = "BPPPB"

		for x in range(toEat):
			if burger[x] == "P":
				pattyCount += 1
		return pattyCount
		
	elif layer == 0:
		if toEat == 1:
			return 1
		else:
			return 0
	
	else:
		items = getItems(layer)
		if toEat == items:
			pattyCount += patEaten(layer, toEat)
      toEat = 0
			return pattyCount
		elif toEat < 2+getItems(layer-1):
			if items + 1 == 2* toEat:
				toEat-=2
				return 1 + patEaten(layer - 1, toEat)
			toEat -= 1
			return patEaten(layer - 1, toEat)
		else:
			toEat -= (1+1+getItems(layer-1))
			pattyCount += 1 + getPats(layer-1)
			
			return pattyCount + patEaten(layer-1, toEat)

#i, j = [int(x) for x in input().split()]
print(patEaten(2,13))
#print(getItems(2))

Fixed submission:
def getItems(layerCount):
	if layerCount == 0:
		return 1
	return 2*getItems(layerCount-1) + 3

def getPats(layerCount):
	return 2**(layerCount + 1) - 1

def patEaten(layer, toEat):
	pattyCount = 0

	if layer == 1:
		burger = "BPPPB"

		for x in range(toEat):
			if burger[x] == "P":
				pattyCount += 1
		return pattyCount
		
	elif layer == 0:
		if toEat == 1:
			return 1
		else:
			return 0
	
	else:
		items = getItems(layer)
		if toEat == items:
			pattyCount += getPats(layer)
			return pattyCount
		elif toEat < 2+getItems(layer-1):
			if items + 1 == 2* toEat:
				toEat-=2
				return 1 + patEaten(layer - 1, toEat)
			toEat -= 1
			return patEaten(layer - 1, toEat)
		else:
			toEat -= (1+1+getItems(layer-1))
			pattyCount += 1 + getPats(layer-1)
			
			return pattyCount + patEaten(layer-1, toEat)

i, j = [int(x) for x in input().split()]
#print(patEaten(2,13))
print(patEaten(i,j))

Buggy python submission (verdict: Runtime Error):
def getItemCount(L):
  if L == 0:
    return 1
  return 2*getItemCount(L-1) + 3
  
def getPatsCount(L, eaten):
  if eaten * 2 - 1 == getItemCount(L):
    return 2**(1+layer) + 1
  return 2**(1+layer)

def getAns(layer, eaten):
  items = getItemCount(layer)
  patsInLayer = getPatsCount(layer, eaten)
  if layer == 0 and eaten == 1:
    return 1
  if eaten == items:
    return patsInLayer
  elif eaten < items:
    return getAns(layer-1, eaten - 1)
  else:
    return patsInLayer + getAns(layer-1, eaten - 1)


layer, eaten = [int(x) for x in input().split()]
print(getAns(layer, eaten))

"""
tPats = 0
if layer != 0:
  while 1:
    items = getItemCount(layer)
    patsInLayer = getPatsCount(layer)

    if eaten == items:
      if layer != 0:
        tPats += patsInLayer
        eaten -= items
      break
    elif eaten < items:
      eaten -= 1
    elif eaten > items:
      tPats += patsInLayer + 1
      eaten -= items
    layer -= 1
    if layer < 0:
      break
else:
  if eaten == 1:
    print(1)
  else:
    print(0)
print(tPats)
"""

Fixed submission:
def getItems(layerCount):
	if layerCount == 0:
		return 1
	return 2*getItems(layerCount-1) + 3

def getPats(layerCount):
	return 2**(layerCount + 1) - 1

def patEaten(layer, toEat):
	pattyCount = 0

	if layer == 1:
		burger = "BPPPB"

		for x in range(toEat):
			if burger[x] == "P":
				pattyCount += 1
		return pattyCount
		
	elif layer == 0:
		if toEat == 1:
			return 1
		else:
			return 0
	
	else:
		items = getItems(layer)
		if toEat == items:
			pattyCount += getPats(layer)
			return pattyCount
		elif toEat < 2+getItems(layer-1):
			if items + 1 == 2* toEat:
				toEat-=2
				return 1 + patEaten(layer - 1, toEat)
			toEat -= 1
			return patEaten(layer - 1, toEat)
		else:
			toEat -= (1+1+getItems(layer-1))
			pattyCount += 1 + getPats(layer-1)
			
			return pattyCount + patEaten(layer-1, toEat)

i, j = [int(x) for x in input().split()]
#print(patEaten(2,13))
print(patEaten(i,j))

Buggy python submission (verdict: Time Limit Exceeded):

def Burger(n, b):
  if n == 0:
    return "P"
  b += "B"
  b += Burger(n-1, "")
  b += "P"
  b += Burger(n-1, "")
  b += "B"
  return b

n, x = [int(x) for x in input().split()]
burger = Burger(n, "")
print(burger[-x:].count("P"))  

Fixed submission:
def getItems(layerCount):
	if layerCount == 0:
		return 1
	return 2*getItems(layerCount-1) + 3

def getPats(layerCount):
	return 2**(layerCount + 1) - 1

def patEaten(layer, toEat):
	pattyCount = 0

	if layer == 1:
		burger = "BPPPB"

		for x in range(toEat):
			if burger[x] == "P":
				pattyCount += 1
		return pattyCount
		
	elif layer == 0:
		if toEat == 1:
			return 1
		else:
			return 0
	
	else:
		items = getItems(layer)
		if toEat == items:
			pattyCount += getPats(layer)
			return pattyCount
		elif toEat < 2+getItems(layer-1):
			if items + 1 == 2* toEat:
				toEat-=2
				return 1 + patEaten(layer - 1, toEat)
			toEat -= 1
			return patEaten(layer - 1, toEat)
		else:
			toEat -= (1+1+getItems(layer-1))
			pattyCount += 1 + getPats(layer-1)
			
			return pattyCount + patEaten(layer-1, toEat)

i, j = [int(x) for x in input().split()]
#print(patEaten(2,13))
print(patEaten(i,j))