def find_right_changepoints(tree, start, end, epsilon=1e-9):
    """ Find all change points in [start: end] where a left-open interval starts or ends

    :param tree: IntervalTree
    :param start: Point from which to look for change points
    :param end: How far to look for change points
    :param epsilon: Modeling open sets
    :returns All change points in tree[start: end]
    """
    # IntervalTree assumes right-open intervals, this makes indexing slightly unintuitive
    # tree = IntervalTree([Interval(0, 1)])
    # tree[0] >>> {Interval(0, 1)}
    # tree[1] >>> {}
    # tree[:0] >>> {}
    # tree[1:] >>> {}
    relevant_intervals = tree[start: end]
    relevant_points = [iv.begin - epsilon for iv in relevant_intervals]  # Left open
    relevant_points += [iv.end for iv in relevant_intervals]
    return {end} | {p for p in relevant_points if start < p < end}