def binary_search(source, target):
    """二分探索. 計算量: O(log n) """
    start, end = 0, len(source)

    while start <= end:
        index = (start + end) // 2  # index: 中央値

        if source[index] == target:
            # 見つかったらそのindexを返す
            return index
        elif source[index] < target:
            # 検索範囲を後半部分にする
            start = index + 1
        else:
            # 検索範囲を前半部分にする
            end = index - 1

    # 見つからない
    return -1