Split by position rather than key:
function splitBySize(node, k)
// Split into first k elements and rest
if node is null then
return (null, null)
leftSize := size(node.left)
if leftSize >= k then
(left, right) := splitBySize(node.left, k)
node.left := right
updateSize(node)
return (left, node)
else
(left, right) := splitBySize(node.right, k - leftSize - 1)
node.right := left
updateSize(node)
return (node, right)
You can access the -th element or split at any position.