# include <bits/stdc++.h>
using namespace std ;
struct node {
int data;
struct node *left, *right, *p;
char color;
};
typedef struct node *ptr;
struct node rbt;
ptr rbtptr = &rbt;
void leftrotate(ptr *root, ptr x)
{
ptr y = x->right;
x->right = y->left;
if (y->left != rbtptr)
{
y->left->p = x;
}
y->p = x->p;
if (x->p == rbtptr)
{
*root = y;
}
else if (x->p->left == x)
x->p->left = y;
else
x->p->right = y;
y->left = x;
x->p = y;
}
void rightrotate(ptr *root, ptr y) {
ptr x = y->left;
y->left = x->right;
if (x->right != rbtptr)
{
x->right->p = y;
}
x->p = y->p;
if (y->p == rbtptr)
{
*root = x;
}
else {
if (y->p->left == y)
{
y->p->left = x;
}
else
{
y->p->right = x;
}
x->right = y;
y->p = x;
}
}
void re_balance(ptr *root, ptr z)
{
while (z->p->color == 'R') {
if (z->p == z->p->p->left) {
ptr y = z->p->p->right;
if (y->color == 'R') {
z->p->color = 'B';
y->color = 'B';
z->p->p->color = 'R';
z = z->p->p;
}
else {
if (z == z->p->right) {
z = z->p;
leftrotate(root,z);
}
z->p->color = 'B';
z->p->p->color = 'R';
rightrotate(root,z->p->p);
}
}
else {
ptr y = z->p->p->left;
if (y->color == 'R') {
z->p->color = 'B';
y->color = 'B';
z->p->p->color = 'R';
z = z->p->p;
}
else {
if (z == z->p->left) {
z = z->p;
rightrotate(root,z);
}
z->p->color = 'B';
z->p->p->color = 'R';
leftrotate(root,z->p->p);
}
}
}
(*root) -> color = 'B';
}
void insert_node(ptr *root, int z) {
ptr Z = (ptr) malloc(sizeof(struct node));
Z->data = z;
ptr y = rbtptr;
ptr x = *root;
while (x != rbtptr) {
y = x;
if (Z->data < x->data)
x = x->left;
else
x = x->right;
}
Z->p = y;
if (y == rbtptr)
*root = Z;
else if (Z->data < y->data)
y->left = Z;
else
y->right = Z;
Z->left = rbtptr;
Z->right = rbtptr;
Z->color = 'R';
re_balance(root,Z);
}
void visit(ptr root)
{
if( root != rbtptr){
visit(root->left) ;
if(root->p == rbtptr){
printf("%d %c NIL\n", (root)->data , (root)->color);
}
else{
printf("%d %c %d\n", (root)->data , (root)->color , (root)->p->data);
}
visit((root)->right) ;
}
return ;
}
void pre_fix_tour(ptr root)
{
if (root == rbtptr)
{
printf("empty tree");
return ;
}
else visit(root) ;
return ;
}
int main()
{
int n,i,val;
scanf("%d",&n);
rbt.left = rbt.right = rbt.p = rbtptr;
rbtptr->color = 'B';
ptr rbtree = rbtptr;
for (i=0; i<n; ++i)
{
scanf("%d", &val);
insert_node(&rbtree, val);
}
pre_fix_tour(rbtree);
return 0;
}
IyBpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZCA7CgpzdHJ1Y3Qgbm9kZSB7CglpbnQgZGF0YTsKCXN0cnVjdCBub2RlICpsZWZ0LCAqcmlnaHQsICpwOwoJY2hhciBjb2xvcjsKfTsKCnR5cGVkZWYgc3RydWN0IG5vZGUgKnB0cjsKc3RydWN0IG5vZGUgcmJ0OwpwdHIgcmJ0cHRyID0gJnJidDsKCnZvaWQgbGVmdHJvdGF0ZShwdHIgKnJvb3QsIHB0ciB4KSAKewoJcHRyIHkgPSB4LT5yaWdodDsKCXgtPnJpZ2h0ID0geS0+bGVmdDsKCWlmICh5LT5sZWZ0ICE9IHJidHB0cikKCXsKCQl5LT5sZWZ0LT5wID0geDsKCX0KCXktPnAgPSB4LT5wOwoJaWYgKHgtPnAgPT0gcmJ0cHRyKQoJewoJCSpyb290ID0geTsKCX0KCWVsc2UgaWYgKHgtPnAtPmxlZnQgPT0geCkKCQl4LT5wLT5sZWZ0ID0geTsKCWVsc2UKCQl4LT5wLT5yaWdodCA9IHk7Cgl5LT5sZWZ0ID0geDsKCXgtPnAgPSB5Owp9Cgp2b2lkIHJpZ2h0cm90YXRlKHB0ciAqcm9vdCwgcHRyIHkpIHsKCXB0ciB4ID0geS0+bGVmdDsKCXktPmxlZnQgPSB4LT5yaWdodDsKCWlmICh4LT5yaWdodCAhPSByYnRwdHIpCgl7CgkJeC0+cmlnaHQtPnAgPSB5OwoJfQoJeC0+cCA9IHktPnA7CglpZiAoeS0+cCA9PSByYnRwdHIpCgl7CgkJKnJvb3QgPSB4OwoJfQoJZWxzZSB7CgkJaWYgKHktPnAtPmxlZnQgPT0geSkKCQl7CgkJCXktPnAtPmxlZnQgPSB4OwoJCX0KCQllbHNlCgkJewoJCQl5LT5wLT5yaWdodCA9IHg7CgkJfQoJeC0+cmlnaHQgPSB5OwoJeS0+cCA9IHg7Cn0KfQp2b2lkIHJlX2JhbGFuY2UocHRyICpyb290LCBwdHIgeikKewoJd2hpbGUgKHotPnAtPmNvbG9yID09ICdSJykgewoJCWlmICh6LT5wID09IHotPnAtPnAtPmxlZnQpIHsKCQkJcHRyIHkgPSB6LT5wLT5wLT5yaWdodDsKCQkJaWYgKHktPmNvbG9yID09ICdSJykgewoJCQkJei0+cC0+Y29sb3IgPSAnQic7CgkJCQl5LT5jb2xvciA9ICdCJzsKCQkJCXotPnAtPnAtPmNvbG9yID0gJ1InOwoJCQkJeiA9IHotPnAtPnA7CgkJCX0KCQkJZWxzZSB7CgkJCQlpZiAoeiA9PSB6LT5wLT5yaWdodCkgewoJCQkJCXogPSB6LT5wOwoJCQkJCWxlZnRyb3RhdGUocm9vdCx6KTsKCQkJCX0KCQkJCXotPnAtPmNvbG9yID0gJ0InOwoJCQkJei0+cC0+cC0+Y29sb3IgPSAnUic7CgkJCQlyaWdodHJvdGF0ZShyb290LHotPnAtPnApOwoJCQl9CgkJfQoJCWVsc2UgewoJCQlwdHIgeSA9IHotPnAtPnAtPmxlZnQ7CgkJCWlmICh5LT5jb2xvciA9PSAnUicpIHsKCQkJCXotPnAtPmNvbG9yID0gJ0InOwoJCQkJeS0+Y29sb3IgPSAnQic7CgkJCQl6LT5wLT5wLT5jb2xvciA9ICdSJzsKCQkJCXogPSB6LT5wLT5wOwoJCQl9CgkJCWVsc2UgewoJCQkJaWYgKHogPT0gei0+cC0+bGVmdCkgewoJCQkJCXogPSB6LT5wOwoJCQkJCXJpZ2h0cm90YXRlKHJvb3Qseik7CgkJCQl9CgkJCQl6LT5wLT5jb2xvciA9ICdCJzsKCQkJCXotPnAtPnAtPmNvbG9yID0gJ1InOwoJCQkJbGVmdHJvdGF0ZShyb290LHotPnAtPnApOwoJCQl9CgkJfQoJfQoJKCpyb290KSAtPiBjb2xvciA9ICdCJzsKfQkKCnZvaWQgaW5zZXJ0X25vZGUocHRyICpyb290LCBpbnQgeikgewoJcHRyIFogPSAocHRyKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBub2RlKSk7CglaLT5kYXRhID0gejsKCXB0ciB5ID0gcmJ0cHRyOwoJcHRyIHggPSAqcm9vdDsKCXdoaWxlICh4ICE9IHJidHB0cikgewoJCXkgPSB4OwoJCWlmIChaLT5kYXRhIDwgeC0+ZGF0YSkKCQkJeCA9IHgtPmxlZnQ7CgkJZWxzZQoJCQl4ID0geC0+cmlnaHQ7Cgl9CglaLT5wID0geTsKCWlmICh5ID09IHJidHB0cikKCQkqcm9vdCA9IFo7CgllbHNlIGlmIChaLT5kYXRhIDwgeS0+ZGF0YSkKCQl5LT5sZWZ0ID0gWjsKCWVsc2UKCQl5LT5yaWdodCA9IFo7CglaLT5sZWZ0ID0gcmJ0cHRyOwoJWi0+cmlnaHQgPSByYnRwdHI7CglaLT5jb2xvciA9ICdSJzsKCXJlX2JhbGFuY2Uocm9vdCxaKTsKfQoKdm9pZCB2aXNpdChwdHIgcm9vdCkKewoKICAgIGlmKCByb290ICE9IHJidHB0cil7CiAgICAgICAgdmlzaXQocm9vdC0+bGVmdCkgOwogICAgICAgIGlmKHJvb3QtPnAgPT0gcmJ0cHRyKXsKICAgICAgICAJcHJpbnRmKCIlZCAlYyBOSUxcbiIsIChyb290KS0+ZGF0YSAsIChyb290KS0+Y29sb3IpOwogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgIAlwcmludGYoIiVkICVjICVkXG4iLCAocm9vdCktPmRhdGEgLCAocm9vdCktPmNvbG9yICwgKHJvb3QpLT5wLT5kYXRhKTsKICAgICAgICB9ICAgICAgICAKICAgICAgICB2aXNpdCgocm9vdCktPnJpZ2h0KSA7CiAgICB9CiAgICByZXR1cm4gOwp9Cgp2b2lkIHByZV9maXhfdG91cihwdHIgcm9vdCkKewogICAgaWYgKHJvb3QgPT0gcmJ0cHRyKQogICAgewogICAgCXByaW50ZigiZW1wdHkgdHJlZSIpOwogICAgICAgIHJldHVybiA7CiAgICB9CiAgICBlbHNlIHZpc2l0KHJvb3QpIDsKICAgIHJldHVybiA7Cn0KCgppbnQgbWFpbigpCnsKCQoJaW50IG4saSx2YWw7CglzY2FuZigiJWQiLCZuKTsKCQoJcmJ0LmxlZnQgPSByYnQucmlnaHQgPSByYnQucCA9IHJidHB0cjsKCXJidHB0ci0+Y29sb3IgPSAnQic7CglwdHIgcmJ0cmVlID0gcmJ0cHRyOwoKCWZvciAoaT0wOyBpPG47ICsraSkKCXsKCQkJc2NhbmYoIiVkIiwgJnZhbCk7CgkJCWluc2VydF9ub2RlKCZyYnRyZWUsIHZhbCk7Cgl9CiAJcHJlX2ZpeF90b3VyKHJidHJlZSk7CgkJCglyZXR1cm4gMDsKfQ==