Three binary search templates: exact match (lo<=hi), boundary finding (lo<hi), and search-on-answer (feasible predicate). Pick by problem type.
BINARY SEARCH — BOUNDARY DECISION
──────────────────────────────────
FIND EXACT VALUE:
while lo <= hi:
mid = (lo + hi) // 2
if a[mid] == target: return mid
elif a[mid] < target: lo = mid + 1
else: hi = mid - 1
return -1
FIND FIRST >= target (leftmost):
while lo < hi:
mid = (lo + hi) // 2
if a[mid] < target: lo = mid + 1
else: hi = mid
return lo # first position >= target
FIND LAST <= target (rightmost):
while lo < hi:
mid = (lo + hi + 1) // 2 # round UP
if a[mid] > target: hi = mid - 1
else: lo = mid
return lo # last position <= target
SEARCH ON ANSWER (min satisfying):
lo, hi = min_ans, max_ans
while lo < hi:
mid = (lo + hi) // 2
if feasible(mid): hi = mid
else: lo = mid + 1
return lo
DECISION:
Exact match? → lo <= hi, 3-way branch
First/last pos? → lo < hi, 2-way converge
Min feasible? → lo < hi, feasible() predicate