Problem p03112 (python)

Fixed submission:
from bisect import bisect_left, bisect_right
INF = 10**12
A, B, Q = map(int, input().split())
shrines = [-INF] + [int(input()) for _ in range(A)] + [INF]
temples = [-INF] + [int(input()) for _ in range(B)] + [INF]
for _ in range(Q):
  query = int(input())
  sh_pos = bisect_left(shrines, query)
  te_pos = bisect_left(temples, query)
  ans = INF
  for s in shrines[sh_pos-1:sh_pos+1]:
    for t in temples[te_pos-1:te_pos+1]:
      dis = min(abs(s-query)+abs(s-t),abs(t-query)+abs(t-s))
      ans = min(ans, dis)
  print(ans)

Buggy submission (verdict: Runtime Error):
import sys
import math

sys.setrecursionlimit(5000)

A, B, Q = map(int, input().split())
LIMIT = 2*(10**10)
shrines = [-LIMIT] + [int(input()) for i in range(A)] + [LIMIT]
temples = [-LIMIT] + [int(input()) for j in range(B)] + [LIMIT]

def b_temp_search(num, idx):
    if num >= temples[idx] and num <= temples[idx+1]:
        return idx
    elif num < temples[idx]:
        if idx == 1:
            return 0
        return b_temp_search(num, math.ceil(idx/2))
    else:
        if idx == B:
            return B + 1
        return b_temp_search(num, math.ceil((B+idx+1)/2))

def b_sh_search(num, idx):
    if num >= shrines[idx] and num <= shrines[idx+1]:
        return idx
    elif num < shrines[idx]:
        if idx == 1:
            return 0
        return b_sh_search(num, math.ceil(idx//2))
    else:
        if idx == A:
            return A + 1
        return b_sh_search(num, math.ceil((A+idx+1)/2))

for k in range(Q):
    x = int(input())
    sh_idx = b_sh_search(x, math.ceil((A+2)//2))
    temp_idx = b_temp_search(x, math.ceil((B+2)//2))
    ptn1 = max(abs(x-shrines[sh_idx]), abs(x-temples[temp_idx]))
    ptn2 = max(abs(x-shrines[sh_idx+1]), abs(x-temples[temp_idx+1]))
    ptn3 = min((temples[temp_idx+1] - x)*2 + x - shrines[sh_idx], temples[temp_idx+1] - x + (x - shrines[sh_idx])*2)
    ptn4 = min((shrines[sh_idx+1] - x)*2 + x - temples[temp_idx], shrines[sh_idx+1] - x + (x - temples[temp_idx])*2)
    ans = min(ptn1, ptn2, ptn3, ptn4)
    print(ans)

Buggy submission (verdict: Runtime Error):
import sys
import math

sys.setrecursionlimit(5000)

A, B, Q = map(int, input().split())
LIMIT = 2*(10**10)
shrines = [-LIMIT] + [int(input()) for i in range(A)] + [LIMIT]
temples = [-LIMIT] + [int(input()) for j in range(B)] + [LIMIT]

def b_temp_search(num, idx):
    if num >= temples[idx] and num <= temples[idx+1]:
        return idx
    elif num < temples[idx]:
        if idx == 1:
            return 0
        return b_temp_search(num, math.ceil(idx/2))
    else:
        if idx == B:
            return B + 1
        return b_temp_search(num, math.ceil((B+idx)/2))

def b_sh_search(num, idx):
    if num >= shrines[idx] and num <= shrines[idx+1]:
        return idx
    elif num < shrines[idx]:
        if idx == 1:
            return 0
        return b_sh_search(num, math.ceil(idx//2))
    else:
        if idx == A:
            return A + 1
        return b_sh_search(num, math.ceil((A+idx)/2))

for k in range(Q):
    x = int(input())
    sh_idx = b_sh_search(x, math.ceil((A+2)//2))
    temp_idx = b_temp_search(x, math.ceil((B+2)//2))
    ptn1 = max(abs(x-shrines[sh_idx]), abs(x-temples[temp_idx]))
    ptn2 = max(abs(x-shrines[sh_idx+1]), abs(x-temples[temp_idx+1]))
    ptn3 = min((temples[temp_idx+1] - x)*2 + x - shrines[sh_idx], temples[temp_idx+1] - x + (x - shrines[sh_idx])*2)
    ptn4 = min((shrines[sh_idx+1] - x)*2 + x - temples[temp_idx], shrines[sh_idx+1] - x + (x - temples[temp_idx])*2)
    ans = min(ptn1, ptn2, ptn3, ptn4)
    print(ans)

Buggy submission (verdict: Runtime Error):
import sys
import math

sys.setrecursionlimit(5000)

A, B, Q = map(int, input().split())
LIMIT = 2*(10**10)
shrines = [-LIMIT] + [int(input()) for i in range(A)] + [LIMIT]
temples = [-LIMIT] + [int(input()) for j in range(B)] + [LIMIT]

def b_temp_search(num, idx):
    if num >= temples[idx] and num <= temples[idx+1]:
        return idx
    elif num < temples[idx]:
        if idx == 1:
            return 0
        return b_temp_search(num, math.ceil(idx/2))
    else:
        if idx == B:
            return B
        return b_temp_search(num, math.ceil((B+idx)/2))

def b_sh_search(num, idx):
    if num >= shrines[idx] and num <= shrines[idx+1]:
        return idx
    elif num < shrines[idx]:
        if idx == 1:
            return 0
        return b_sh_search(num, math.ceil(idx//2))
    else:
        if idx == A:
            return A
        return b_sh_search(num, math.ceil((A+idx)/2))

for k in range(Q):
    x = int(input())
    sh_idx = b_sh_search(x, A//2)
    temp_idx = b_temp_search(x, B//2)
    ptn1 = max(abs(x-shrines[sh_idx]), abs(x-temples[temp_idx]))
    ptn2 = max(abs(x-shrines[sh_idx+1]), abs(x-temples[temp_idx+1]))
    ptn3 = min((temples[temp_idx+1] - x)*2 + x - shrines[sh_idx], temples[temp_idx+1] - x + (x - shrines[sh_idx])*2)
    ptn4 = min((shrines[sh_idx+1] - x)*2 + x - temples[temp_idx], shrines[sh_idx+1] - x + (x - temples[temp_idx])*2)
    ans = min(ptn1, ptn2, ptn3, ptn4)
    print(ans)