code: def cut(self, a, b, bstjoin=False):
          
          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
docs: 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))