include
struct Node { int key; Node* left; Node* right; Node* parent; // Added parent pointer for easier traversal Node(int k, Node* p = nullptr) : key(k), left(nullptr), right(nullptr), parent(p) {} };
Node* createNode(int key, Node* parent = nullptr) { return new Node(key, parent); }
Node* rightRotate(Node* x) { Node* y = x->left; x->left = y->right; if (y->right) y->right->parent = x; y->right = x; y->parent = x->parent; x->parent = y; return y; }
Node* leftRotate(Node* x) { Node* y = x->right; x->right = y->left; if (y->left) y->left->parent = x; y->left = x; y->parent = x->parent; x->parent = y; return y; }
Node* splay(Node* root, int key) { if (root == nullptr || root->key == key) return root;
if (root->key > key) {
if (root->left == nullptr)
return root;
if (root->left->key > key) {
root->left->left = splay(root->left->left, key);
root = rightRotate(root);
}
else if (root->left->key < key) {
root->left->right = splay(root->left->right, key);
if (root->left->right != nullptr)
root->left = leftRotate(root->left);
}
return (root->left == nullptr) ? root : rightRotate(root);
}
else {
if (root->right == nullptr)
return root;
if (root->right->key > key) {
root->right->left = splay(root->right->left, key);
if (root->right->left != nullptr)
root->right = rightRotate(root->right);
}
else if (root->right->key < key) {
root->right->right = splay(root->right->right, key);
root = leftRotate(root);
}
return (root->right == nullptr) ? root : leftRotate(root);
}}
Node* insert(Node* root, int key) { if (root == nullptr) return createNode(key);
root = splay(root, key);
if (root->key == key)
return root;
Node* newNode = createNode(key);
if (root->key > key) {
newNode->right = root;
newNode->left = root->left;
if (root->left)
root->left->parent = newNode;
root->left = nullptr;
}
else {
newNode->left = root;
newNode->right = root->right;
if (root->right)
root->right->parent = newNode;
root->right = nullptr;
}
newNode->parent = nullptr; // New root has no parent
return newNode;}
void inOrder(Node* root) { if (root) { inOrder(root->left); std::cout << root->key << " "; inOrder(root->right); } }
int main() { Node* root = nullptr;
root = insert(root, 10); root = insert(root, 20); root = insert(root, 30); root = insert(root, 40); root = insert(root, 50); std::cout << "Inorder traversal of the splay tree: "; inOrder(root); std::cout << std::endl; return 0;
}








I think you meant USACO Platinum :)