def binary_search(arr, x):
    return _binary_search(arr, 0, len(arr) - 1, x)


def _binary_search(arr, low, high, x):
    # Check base case
    if high >= low:
        mid = (high + low) // 2
        # If element is present at the middle itself
        if arr[mid] == x:
            return mid
        # If element is smaller than mid, then it can only
        # be present in left subarray
        elif arr[mid] > x:
            return _binary_search(arr, low, mid - 1, x)
        # Else the element can only be present in right subarray
        else:
            return _binary_search(arr, mid + 1, high, x)
    else:
        # Element is not present in the array
        return -1
