import std.array;

bool binarySearch(T)(T[] input, T value)
{
    while (!input.empty)
    {
        auto i = input.length / 2;
        auto mid = input[i];
        if (mid > value) input = input[0 .. i];
        else if (mid < value) input = input[i + 1 .. $];
        else return true;
    }
    return false;
}

// рекурсивная версия
bool binarySearchR(T)(T[] input, T value)
{
    if (input.empty) return false;
    auto i = input.length / 2;
    auto mid = input[i];
    if (mid > value) return binarySearch(input[0 .. i], value);
    if (mid < value) return binarySearch(input[i + 1 .. $], value);
    return true;
}

unittest
{
    assert(binarySearch([ 1, 3, 6, 7, 9, 15 ], 6));
    assert(!binarySearch([ 1, 3, 6, 7, 9, 15 ], 5));
    assert(binarySearchR([ 1, 3, 6, 7, 9, 15 ], 6));
    assert(!binarySearchR([ 1, 3, 6, 7, 9, 15 ], 5));
    // Ука­зать T яв­но (на­при­мер, для на­деж­но­сти)
    assert(binarySearch!(int)([ 1, 3, 6, 7, 9, 15 ], 6));
}
