# sorted list class

class SortedList(list):
    ''' list in non-decreasing order '''

    def __contains__(self, v, start=None, stop=None):
        ''' (SortedList) -> bool

        Return whether SortedList (self) contains v.

        >>> L = SortedList()
        >>> 15 in L
        False
        >>> L = SortedList([17])
        >>> 17 in L
        True
        >>> L = SortedList([5, 10, 15, 20])
        >>> 15 in L
        True
        >>> 17 in L
        False
        '''
        if start is None:
            start, stop = 0, len(self) - 1
        if start > stop:
            return False
        elif start == stop:
            return self[start] == v
        else:
            mid = (stop + start) // 2
            if self[mid] < v:
                return self.__contains__(v, mid + 1, stop)
            else:
                return self.__contains__(v, start, mid)


if __name__ == '__main__':
    import doctest
    doctest.testmod()
    n = 100000000
    L = list(range(n))
    import time
    start = time.time()
    print(n // 2 in L)
    print('ran n//2 in Python list L: {} seconds on Python list'.
          format(time.time() - start))
    L = SortedList(L)
    start = time.time()
    print(n // 2 in L)
    print('ran n//2 in SortedList L: {} seconds on SortedList'.
          format(time.time() - start))


