二分查找
函数 bsearch_l 寻找区间 false -> true 的第一个 true。
函数 bsearch_r 寻找区间 true -> false 的最后一个 true。
若无答案,返回
cpp
i64 bsearch_l(i64 l, i64 r, auto check) {
while (r - l > 1) {
i64 m = l + (r - l) / 2;
check(m - 1) ? r = m : l = m;
}
return check(l) ? l : r;
}
i64 bsearch_r(i64 l, i64 r, auto check) {
while (r - l > 1) {
i64 m = l + (r - l) / 2;
check(m) ? l = m : r = m;
}
return check(l) ? l : r;
}