function remove(X, T) {
if (nil(T)) return T;
if (X < T.value) {
T.left = remove(X, T.left);
} else if (X > T.value) {
T.right = remove(X, T.right);
} else {
if (leaf(T)) return NIL;
if (nil(T.left)) {
const L = successor(T);
T.value = L.value;
T.right = remove(L.value, T.right);
} else {
const L = predecessor(T);
T.value = L.value;
T.left = remove(L.value, T.left);
}
}
T = skew(decrease_level(T));
T.right = skew(T.right);
if (!nil(T.right)) {
T.right.right = skew(T.right.right);
}
T = split(T);
T.right = split(T.right);
return T;
}