struct node{
int val;
int len;
node *lc,*rc;
node(int a,int b,int c) {
val = a;
siz = b;
len = c;
lc = NULL;
rc = NULL;
}
};
void update(node *a) {
node *l = a->lc;
node *r = a->rc;
int len1 = 0;
int len2 = 0;
if (l != NULL) len1 = l->len;
if (r != NULL) len2 = r->len;
if (len1 < len2) {
node *tmp = a->lc;
a->lc = a->rc;
a->rc = tmp;
}
a->len = (len1 < len2 ? len1 : len2) + 1;
}
node* merge(node *a,node *b) {
if (a == NULL) return b;
if (b == NULL) return a;
if (a->val < b->val) {
a->rc = merge(a->rc, b);
update(a);
return a;
}else {
b->rc = merge(a,b->rc);
update(b);
return b;
}
}
node* remove(node *a) {
return merge(a->lc, a->rc);
}