Problem:
Binary Search Tree II

Write a program which performs the following operations to a binary search tree $T$ by adding the find operation to A: Binary Search Tree I.

insert $k$: Insert a node containing $k$ as key into $T$.

find $k$: Report whether $T$ has a node containing $k$.

print: Print the keys of the binary search tree by inorder tree walk and preorder tree walk respectively.

Input

In the first line, the number of operations $m$ is given. In the following $m$ lines, operations represented by insert $k$, find $k$ or print are given.

Output

For each find $k$ operation, print "yes" if $T$ has a node containing $k$, "no" if not.

In addition, for each print operation, print a list of keys obtained by inorder tree walk and preorder tree walk in a line respectively. Put a space character before each key.

Constraints

The number of operations $\leq 500,000$

The number of print operations $\leq 10$.

$-2,000,000,000 \leq key \leq 2,000,000,000$

The height of the binary tree does not exceed 100 if you employ the above pseudo code.

The keys in the binary search tree are all different.

Sample Input 1

10
insert 30
insert 88
insert 12
insert 1
insert 20
find 12
insert 17
insert 25
find 16
print

Sample Output 1

yes
no
1 12 17 20 25 30 88
30 12 1 20 17 25 88

Reference

Introduction to Algorithms, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. The MIT Press.

Solution in C# (judge verdict: Accepted)

using System;
using System.Linq;
using System.Collections.Generic;
using static System.Console;
using System.Text;
using System.IO;

namespace AOJ
{
    class Program
    {
        static public long[] Sarray() { return ReadLine().Split().Select(long.Parse).ToArray(); }
        static public List<long> Slist() { return ReadLine().Split().Select(long.Parse).ToList(); }

        class node
        {
            public node left = null;
            public node right = null;
            public long value = -1;
            public node oya = null;
        }
        static void Main(string[] args)
        {
            var N = Sarray()[0];
            var nodes = new node[N];

            node root = null;
            Action<node> insert = null;
            insert = z =>
                  {
                      node y = null;
                      node x = root;
                      while (x != null)
                      {
                          y = x;
                          if (z.value < x.value)
                              x = x.left;
                          else
                              x = x.right;
                      }
                      if (y == null)
                          root = z;
                      else if (z.value < y.value)
                          y.left = z;
                      else
                          y.right = z;
                  };
            Action<long> find = null;
            find = v =>
              {
                  var x = root;
                  while (x != null)
                  {
                      if (x.value == v)
                      {
                          WriteLine("yes");
                          return;
                      }
                      if (x.value < v)
                          x = x.right;
                      else
                          x = x.left;
                  }
                  WriteLine("no");
              };
            Action<node> order = null;
            var preorder = new List<long>();
            var inorder = new List<long>();
            order = n =>
            {
                if (n == null)
                    return;
                preorder.Add(n.value);
                order(n.left);
                inorder.Add(n.value);
                order(n.right);
            };

            for (var i=0;i<N;++i)
            {
                var tmp = ReadLine().Split();
                if (tmp[0] == "insert")
                { insert(new node() { value = long.Parse(tmp[1]) }); }
                else if(tmp[0]=="find")
                { find(long.Parse(tmp[1])); }
                else
                {
                    preorder = new List<long>();
                    inorder = new List<long>();
                    order(root);
                    WriteLine(" " + string.Join(" ", inorder));
                    WriteLine(" " + string.Join(" ", preorder));
                }
            }
        }
    }
}