#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
int data, d;
struct node *l, *r;
};
int max(int a, int b)
{
return a > b ? a : b;
}
int deep(struct node * root)
{
if(!root)return -1;
else return root->d;
}
struct node *LL(struct node * root)
{
struct node *p;
p = root->l;
root->l = p->r;
p->r = root;
root->d = max(deep(root->l), deep(root->r)) + 1;
return p;
};
struct node * RR(struct node *root)
{
struct node *p;
p = root->r;
root->r = p->l;
p->l = root;
root->d = max(deep(root->l), deep(root->r)) + 1;
return p;
}
struct node *LR(struct node * root)
{
root->l = RR(root->l);
root = LL(root);
return root;
};
struct node *RL(struct node * root)
{
root->r = LL(root->r);
root = RR(root);
return root;
};
struct node * create(int x, struct node * root)
{
if(!root)
{
root = (struct node * )malloc(sizeof(struct node ));
root->data = x;
root->d = 0;
root->l = NULL;
root->r = NULL;
}
else
{
if(x < root->data)
{
root->l = create(x, root->l);
if(deep(root->l) - deep(root->r) > 1)
{
if(root->l->data > x)
root = LL(root);
else
root = LR(root);
}
}
else if(x > root->data)
{
root->r = create(x, root->r);
if(deep(root->r) - deep(root->l) > 1)
{
if(root->r->data < x)
root = RR(root);
else
root = RL(root);
}
}
}
root->d = max(deep(root->r), deep(root->l)) + 1;
return root;
};