std::lower_bound/upper_bound

class Solution {
   public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int n = (int)nums.size();
        // lower_bound 的可能实现
        auto lowerbound = [&](auto &&less) {
            int lo = 0, hi = n;
            while (lo < hi) {
                int mid = (lo + hi) / 2;
                if (less(nums[mid], target)) lo = mid + 1;
                else                         hi = mid;
            }
            return lo;
        };
        // std::lower_bound
        int left = lowerbound(std::less<>{});
        // std::upper_bound
        int right = lowerbound(std::less_equal<>{});
        return (left < n && nums[left] == target) ? 
                vector<int>{left, right-1} : 
                vector<int>{-1, -1};
    }
};