using System.Collections.Generic;
public class RankFromStream{
public TreeNode(int val, int rank){
private Dictionary<int,int> valToRank;
valToRank = new Dictionary<int,int>();
private void Insert(TreeNode node, int x, int newRank){
node.Right = new TreeNode(x, newRank+node.Rank+1);
else Insert(node.Right, x, newRank+node.Rank+1);
node.Left = new TreeNode(x, newRank);
else Insert(node.Left, x, newRank);
public void Track(int x){
root = new TreeNode(x, 0);
private TreeNode Search(TreeNode node, int x){
if (node == null) return null;
if (node.Val == x) return node;
return Search(node.Right, x);
return Search(node.Left, x);
public int GetRankOfNumber(int x){
var node = Search(root, x);
if (node == null) return -1;
public static void Main()
var RfS = new RankFromStream();
Console.WriteLine(RfS.GetRankOfNumber(1));
Console.WriteLine(RfS.GetRankOfNumber(3));
Console.WriteLine(RfS.GetRankOfNumber(4));