def search_rotated_array(arr, target):
    left, right = 0, len(arr) - 1
    
    while left <= right:
        mid = (left + right) // 2
        
        if arr[mid] == target:
            return mid
        
        if arr[left] <= arr[mid]:  # Left half is sorted
            if arr[left] <= target < arr[mid]:
                right = mid - 1
            else:
                left = mid + 1
        else:  # Right half is sorted
            if arr[mid] < target <= arr[right]:
                left = mid + 1
            else:
                right = mid - 1
    
    return -1

def find_first_and_last(arr, target):
    def binary_search_first():
        left, right = 0, len(arr) - 1
        first = -1
        while left <= right:
            mid = (left + right) // 2
            if arr[mid] == target:
                first = mid
                right = mid - 1  # Search left part
            elif arr[mid] < target:
                left = mid + 1
            else:
                right = mid - 1
        return first
    
    def binary_search_last():
        left, right = 0, len(arr) - 1
        last = -1
        while left <= right:
            mid = (left + right) // 2
            if arr[mid] == target:
                last = mid
                left = mid + 1  # Search right part
            elif arr[mid] < target:
                left = mid + 1
            else:
                right = mid - 1
        return last
    
    first = binary_search_first()
    last = binary_search_last()
    return (first, last)

def find_smallest_greater_or_equal(arr, target):
    left, right = 0, len(arr) - 1
    result = -1
    
    while left <= right:
        mid = (left + right) // 2
        if arr[mid] >= target:
            result = arr[mid]
            right = mid - 1  # Search left part
        else:
            left = mid + 1
    
    return result

# Example test cases
print(search_rotated_array([4, 5, 6, 7, 0, 1, 2], 1))  # Output: 5
print(find_first_and_last([1, 2, 2, 2, 3, 4, 5], 2))  # Output: (1, 3)
print(find_smallest_greater_or_equal([1, 3, 5, 7, 9, 11], 8))  # Output: 9

5
(1, 3)
9