def lower_bound(values, target):
    lo, hi = 0, len(values)
    while lo < hi:
        mid = (lo + hi) // 2
        if values[mid] < target:
            lo = mid + 1
        else:
            hi = mid
    return lo


def minimum_capacity(weights, days):
    if days <= 0 or any(w <= 0 for w in weights):
        raise ValueError('days and weights must be positive')
    if not weights:
        return 0

    def feasible(capacity):
        used, load = 1, 0
        for weight in weights:
            if load + weight > capacity:
                used += 1
                load = 0
            load += weight
        return used <= days

    lo, hi = max(weights), sum(weights)
    while lo < hi:
        mid = (lo + hi) // 2
        if feasible(mid):
            hi = mid
        else:
            lo = mid + 1
    return lo


if __name__ == '__main__':
    print(lower_bound([1, 3, 3, 6], 3))
    print(minimum_capacity([3, 2, 2, 4], 2))
