#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <stack>
using namespace std;
struct node{
int val;
node *left,*right;
};
//右旋
node *RightRotate(node *root){
node *temp=root->left;
root->left=temp->right;
temp->right=root;
return temp;
}
//左旋
node *LeftRotate(node *root){
node *temp=root->right;
root->right=temp->left;
temp->left=root;
return temp;
}
//RL状态处理
node *RLRotate(node *root){
root->right=RightRotate(root->right);
return LeftRotate(root);
}
//LR状态处理
node *LRRotate(node *root){
root->left=LeftRotate(root->left);
return RightRotate(root);
}
int getHeight(node *root){
if(root==NULL) return 0;
int l=getHeight(root->left);
int r=getHeight(root->right);
return max(l,r)+1;
}
//插入处理
node *Tnsert(node *root,int val){
if(root==NULL){
root=new node;
root->val=val;
root->left=root->right=NULL;
}else if(val<root->val){
root->left=Tnsert(root->left,val);
int l=getHeight(root->left);
int r=getHeight(root->right);
if(l-r>=2){
if(val<root->left->val){
root=RightRotate(root);
}
else{
root=LRRotate(root);
}
}
}
else{
root->right=Tnsert(root->right,val);
int l=getHeight(root->left);
int r=getHeight(root->right);
if(r-l>=2){
if(val>root->right->val){
root=LeftRotate(root);
}
else{
root=RLRotate(root);
}
}
}
return root;
}