#include <bits/stdc++.h>
using namespace std;
template <class T>
struct splaytree {
struct node {
splaytree<T> *tree;
node *p, *c[2];
T v;
int w;
node(T t, splaytree<T> *st) {
v = t;
p = 0;
c[0] = 0;
c[1] = 0;
w = 1;
tree = st;
}
int side() {
return (p->c[1] == this) ? 1:0;
}
void r() {
node *x = this;
int b = x->side();
node *p = x->p;
x->w = p->w;
p->w = x->c[1^b]->w + 1 + p->c[1^b]->w;
x->p = p->p;
p->p = x;
p->c[0^b] = x->c[1^b];
x->c[1^b] = p;
}
void splay() {
node *x = this;
while (x->p) {
node *p = x->p;
if (p == tree->root) x->r();
else if (((x->side())^(p->side()))) {
x->r();
x->r();
}
else {
p->r();
x->r();
}
}
tree->root = this;
}
int index() {
this->splay();
return this->c[0]->w;
}
};
node *root;
splaytree() {
root = 0;
}
void add(T k) {
node x0(k,this);
node *x = &x0;
if (root == 0) {
root = x;
return;
}
node *i = root;
while (i != x) {
int b = (k < i->v) ? 0:1;
if (i->c[b] == 0) {
i->c[b] = x;
i->w++;
x->p = i;
}
i = i->c[b];
}
x->splay();
}
};
int main() {
splaytree<int> st;
st.add(2);
cout << st.root->v << endl;
cout << st.root->v << endl;
st.add(3);
cout << st.root->c[0] << endl;
}
CiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCnRlbXBsYXRlIDxjbGFzcyBUPgpzdHJ1Y3Qgc3BsYXl0cmVlIHsKCXN0cnVjdCBub2RlIHsKCQlzcGxheXRyZWU8VD4gKnRyZWU7CgkJbm9kZSAqcCwgKmNbMl07CgkJVCB2OwoJCWludCB3OwoJCW5vZGUoVCB0LCBzcGxheXRyZWU8VD4gKnN0KSB7CgkJCXYgPSB0OwoJCQlwID0gMDsKCQkJY1swXSA9IDA7CgkJCWNbMV0gPSAwOwoJCQl3ID0gMTsKCQkJdHJlZSA9IHN0OwoJCX0KCQlpbnQgc2lkZSgpIHsKCQkJcmV0dXJuIChwLT5jWzFdID09IHRoaXMpID8gMTowOwoJCX0KCQl2b2lkIHIoKSB7CgkJCW5vZGUgKnggPSB0aGlzOwoJCQlpbnQgYiA9IHgtPnNpZGUoKTsKCQkJbm9kZSAqcCA9IHgtPnA7CgkJCXgtPncgPSBwLT53OwoJCQlwLT53ID0geC0+Y1sxXmJdLT53ICsgMSArIHAtPmNbMV5iXS0+dzsKCQkJeC0+cCA9IHAtPnA7CgkJCXAtPnAgPSB4OwoJCQlwLT5jWzBeYl0gPSB4LT5jWzFeYl07CgkJCXgtPmNbMV5iXSA9IHA7CgkJfQoJCXZvaWQgc3BsYXkoKSB7CgkJCW5vZGUgKnggPSB0aGlzOwoJCQl3aGlsZSAoeC0+cCkgewoJCQkJbm9kZSAqcCA9IHgtPnA7CgkJCQlpZiAocCA9PSB0cmVlLT5yb290KSB4LT5yKCk7CgkJCQllbHNlIGlmICgoKHgtPnNpZGUoKSleKHAtPnNpZGUoKSkpKSB7CgkJCQkJeC0+cigpOwoJCQkJCXgtPnIoKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCXAtPnIoKTsKCQkJCQl4LT5yKCk7CgkJCQl9CgkJCX0KCQkJdHJlZS0+cm9vdCA9IHRoaXM7CgkJfQoJCWludCBpbmRleCgpIHsKCQkJdGhpcy0+c3BsYXkoKTsKCQkJcmV0dXJuIHRoaXMtPmNbMF0tPnc7CgkJfQoJfTsKCW5vZGUgKnJvb3Q7CglzcGxheXRyZWUoKSB7CgkJcm9vdCA9IDA7Cgl9Cgl2b2lkIGFkZChUIGspIHsKCQlub2RlIHgwKGssdGhpcyk7CgkJbm9kZSAqeCA9ICZ4MDsKCQlpZiAocm9vdCA9PSAwKSB7CgkJCXJvb3QgPSB4OwoJCQlyZXR1cm47CgkJfQoJCW5vZGUgKmkgPSByb290OwoJCXdoaWxlIChpICE9IHgpIHsKCQkJaW50IGIgPSAoayA8IGktPnYpID8gMDoxOwoJCQlpZiAoaS0+Y1tiXSA9PSAwKSB7CgkJCQlpLT5jW2JdID0geDsKCQkJCWktPncrKzsKCQkJCXgtPnAgPSBpOwoJCQl9CgkJCWkgPSBpLT5jW2JdOwoJCX0KCQl4LT5zcGxheSgpOwoJfQp9OwoKaW50IG1haW4oKSB7CglzcGxheXRyZWU8aW50PiBzdDsKCXN0LmFkZCgyKTsKCWNvdXQgPDwgc3Qucm9vdC0+diA8PCBlbmRsOwoJY291dCA8PCBzdC5yb290LT52IDw8IGVuZGw7CglzdC5hZGQoMyk7Cgljb3V0IDw8IHN0LnJvb3QtPmNbMF0gPDwgZW5kbDsKfQo=