cuts edge (a, b) into two parts because this is a tree

        a, b = (2, 5)
        print(self.first_lookup[a] > self.first_lookup[b])
        tree = self.tour_tree
        list(tree.item_slice(k1, k2))

def cut(self, a, b, bstjoin=False):
        """
        cuts edge (a, b) into two parts because this is a tree

        a, b = (2, 5)
        print(self.first_lookup[a] > self.first_lookup[b])
        tree = self.tour_tree
        list(tree.item_slice(k1, k2))
        """
        if self.first_lookup[a] > self.last_lookup[b]:
            a, b = b, a

        o_a1 = self.first_lookup[a]
        o_a2 = self.last_lookup[a]
        o_b1 = self.first_lookup[b]
        o_b2 = self.last_lookup[b]
        assert o_a1 < o_b1
        # assert o_b1 < o_b2
        assert o_b2 < o_a2

        # splice out the inside contiguous range inplace
        inside, outside = self.tour_tree.splice_inplace(o_b1, o_b2 + 1)
        # Remove unneeded values
        outside = outside.splice_inplace(o_b1, o_a2 + 1)[1]

        other = EulerTourTree()
        other.tour_tree = inside
        # We can reuse these pointers without any modification
        other.first_lookup = self.first_lookup
        other.first_lookup = self.last_lookup
        # Should make an O(n) cleanup step at some point
        return other