#include <bits/stdc++.h>
using namespace std;
/* A binary tree node has data, pointer to left child
and a pointer to right child */
struct Node
{
int data;
struct Node* left;
struct Node* right;
} ;
/* Helper function that allocates a new node with the
given data and NULL left and right pointers. */
struct Node* newNode( int data)
{
struct Node* node = ( struct Node* )
malloc ( sizeof ( struct Node) ) ;
node- > data = data;
node- > left = NULL ;
node- > right = NULL ;
return ( node) ;
}
int findLevel( Node * root,int k,int level)
{
if ( root== NULL )
return - 1 ;
if ( root- > data == k)
return level;
int l = findLevel( root- > left,k,level+ 1 ) ;
return ( l! = - 1 ) ? l: findLevel( root- > right,k,level+ 1 ) ;
}
Node * findDistU( Node * root,int n1,int n2,int & d1,int & d2,int & dist,int lvl)
{
if ( root== NULL )
return NULL ;
if ( root- > data== n1)
{
d1 = lvl;
return root;
}
if ( root- > data== n2)
{
d2 = lvl;
return root;
}
Node * l = findDistU( root- > left,n1,n2,d1,d2,dist,lvl+ 1 ) ;
Node * r = findDistU( root- > right,n1,n2,d1,d2,dist,lvl+ 1 ) ;
if ( l and r)
{
dist = d1+ d2- 2 * lvl;
}
return ( l! = NULL ) ? l : r;
}
int findDist( Node * root,int n1,int n2)
{
int d1= - 1 ,d2= - 1 ,dist;
Node * lca = findDistU( root,n1,n2,d1,d2,dist,1 ) ;
if ( d1! = - 1 and d2! = - 1 )
{
return dist;
}
if ( d1! = - 1 )
{
dist = findLevel( lca,n2,0 ) ;
return dist;
}
if ( d2! = - 1 )
{
dist = findLevel( lca,n1,0 ) ;
return dist;
}
return - 1 ;
}
/* Driver program to test size function*/
int main( )
{
int t;
struct Node * child;
scanf ( "%d\n " , & t) ;
while ( t-- )
{
map< int , Node* > m;
int n;
scanf ( "%d\n " ,& n) ;
struct Node * root = NULL ;
if ( n== 1 )
{
int a;
cin >> a;
cout << a<< endl;
} else {
while ( n-- )
{
Node * parent;
char lr;
int n1, n2;
scanf ( "%d %d %c" , & n1, & n2, & lr) ;
// cout << n1 << " " << n2 << " " << (char)lr << endl;
if ( m.find ( n1) == m.end ( ) )
{
parent = newNode( n1) ;
m[ n1] = parent;
if ( root == NULL )
root = parent;
}
else
parent = m[ n1] ;
child = newNode( n2) ;
if ( lr == 'L' )
parent- > left = child;
else
parent- > right = child;
m[ n2] = child;
}
int a,b;
cin >> a>> b;
cout << findDist( root,a,b) << endl;
}
}
return 0 ;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovKiBBIGJpbmFyeSB0cmVlIG5vZGUgaGFzIGRhdGEsIHBvaW50ZXIgdG8gbGVmdCBjaGlsZAogICBhbmQgYSBwb2ludGVyIHRvIHJpZ2h0IGNoaWxkICovCnN0cnVjdCBOb2RlCnsKICAgIGludCBkYXRhOwogICAgc3RydWN0IE5vZGUqIGxlZnQ7CiAgICBzdHJ1Y3QgTm9kZSogcmlnaHQ7Cn07CgoKLyogSGVscGVyIGZ1bmN0aW9uIHRoYXQgYWxsb2NhdGVzIGEgbmV3IG5vZGUgd2l0aCB0aGUKICAgZ2l2ZW4gZGF0YSBhbmQgTlVMTCBsZWZ0IGFuZCByaWdodCBwb2ludGVycy4gKi8Kc3RydWN0IE5vZGUqIG5ld05vZGUoaW50IGRhdGEpCnsKICBzdHJ1Y3QgTm9kZSogbm9kZSA9IChzdHJ1Y3QgTm9kZSopCiAgICAgICAgICAgICAgICAgICAgICAgbWFsbG9jKHNpemVvZihzdHJ1Y3QgTm9kZSkpOwogIG5vZGUtPmRhdGEgPSBkYXRhOwogIG5vZGUtPmxlZnQgPSBOVUxMOwogIG5vZGUtPnJpZ2h0ID0gTlVMTDsKCiAgcmV0dXJuKG5vZGUpOwp9CgoKaW50IGZpbmRMZXZlbChOb2RlICpyb290LGludCBrLGludCBsZXZlbCkKewogICAgaWYocm9vdD09TlVMTCkKICAgICAgICByZXR1cm4gLTE7CiAgICBpZihyb290LT5kYXRhID09aykKICAgICAgICByZXR1cm4gbGV2ZWw7CiAgICBpbnQgbCA9IGZpbmRMZXZlbChyb290LT5sZWZ0LGssbGV2ZWwrMSk7CiAgICByZXR1cm4gKGwhPS0xKT9sOmZpbmRMZXZlbChyb290LT5yaWdodCxrLGxldmVsKzEpOwp9CgpOb2RlICpmaW5kRGlzdFUoTm9kZSAqcm9vdCxpbnQgbjEsaW50IG4yLGludCAmZDEsaW50ICZkMixpbnQgJmRpc3QsaW50IGx2bCkKewogICAgaWYocm9vdD09TlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGlmKHJvb3QtPmRhdGE9PW4xKQogICAgewogICAgICAgIGQxID0gbHZsOwogICAgICAgIHJldHVybiByb290OwogICAgfQogICAgaWYocm9vdC0+ZGF0YT09bjIpCiAgICB7CiAgICAgICAgZDIgPSBsdmw7CiAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CgogICAgTm9kZSAqbCA9IGZpbmREaXN0VShyb290LT5sZWZ0LG4xLG4yLGQxLGQyLGRpc3QsbHZsKzEpOwogICAgTm9kZSAqciA9IGZpbmREaXN0VShyb290LT5yaWdodCxuMSxuMixkMSxkMixkaXN0LGx2bCsxKTsKCiAgICBpZihsIGFuZCByKQogICAgewogICAgICAgIGRpc3QgPSBkMStkMi0yKmx2bDsKICAgIH0KICAgIHJldHVybiAobCE9TlVMTCk/IGwgOnI7Cn0KaW50IGZpbmREaXN0KE5vZGUgKnJvb3QsaW50IG4xLGludCBuMikKewogICAgaW50IGQxPS0xLGQyPS0xLGRpc3Q7CiAgICBOb2RlICpsY2EgPSBmaW5kRGlzdFUocm9vdCxuMSxuMixkMSxkMixkaXN0LDEpOwogICAgaWYoZDEhPS0xIGFuZCBkMiE9LTEpCiAgICB7CiAgICAgICByZXR1cm4gZGlzdDsKICAgIH0KCiAgICBpZihkMSE9LTEpCiAgICB7CiAgICAgICAgZGlzdCA9IGZpbmRMZXZlbChsY2EsbjIsMCk7CiAgICAgICAgcmV0dXJuIGRpc3Q7CiAgICB9CiAgICBpZihkMiE9LTEpCiAgICB7CiAgICAgICAgZGlzdCA9IGZpbmRMZXZlbChsY2EsbjEsMCk7CiAgICAgICAgcmV0dXJuIGRpc3Q7CiAgICB9CiAgICByZXR1cm4gLTE7Cn0KCgovKiBEcml2ZXIgcHJvZ3JhbSB0byB0ZXN0IHNpemUgZnVuY3Rpb24qLwppbnQgbWFpbigpCnsKICBpbnQgdDsKICBzdHJ1Y3QgTm9kZSAqY2hpbGQ7CiAgc2NhbmYoIiVkXG4iLCAmdCk7CiAgd2hpbGUgKHQtLSkKICB7CiAgICAgbWFwPGludCwgTm9kZSo+IG07CiAgICAgaW50IG47CiAgICAgc2NhbmYoIiVkXG4iLCZuKTsKICAgICBzdHJ1Y3QgTm9kZSAqcm9vdCA9IE5VTEw7CiAgICAgaWYobj09MSkKICAgICB7CiAgICAgICAgaW50IGE7CiAgICAgICAgY2luPj5hOwogICAgICAgIGNvdXQ8PGE8PGVuZGw7CiAgICAgfWVsc2V7CiAgICAgd2hpbGUgKG4tLSkKICAgICB7CiAgICAgICAgTm9kZSAqcGFyZW50OwogICAgICAgIGNoYXIgbHI7CiAgICAgICAgaW50IG4xLCBuMjsKICAgICAgICBzY2FuZigiJWQgJWQgJWMiLCAmbjEsICZuMiwgJmxyKTsKICAgICAgLy8gIGNvdXQgPDwgbjEgPDwgIiAiIDw8IG4yIDw8ICIgIiA8PCAoY2hhcilsciA8PCBlbmRsOwogICAgICAgIGlmIChtLmZpbmQobjEpID09IG0uZW5kKCkpCiAgICAgICAgewogICAgICAgICAgIHBhcmVudCA9IG5ld05vZGUobjEpOwogICAgICAgICAgIG1bbjFdID0gcGFyZW50OwogICAgICAgICAgIGlmIChyb290ID09IE5VTEwpCiAgICAgICAgICAgICByb290ID0gcGFyZW50OwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgcGFyZW50ID0gbVtuMV07CgogICAgICAgIGNoaWxkID0gbmV3Tm9kZShuMik7CiAgICAgICAgaWYgKGxyID09ICdMJykKICAgICAgICAgIHBhcmVudC0+bGVmdCA9IGNoaWxkOwogICAgICAgIGVsc2UKICAgICAgICAgIHBhcmVudC0+cmlnaHQgPSBjaGlsZDsKICAgICAgICBtW24yXSAgPSBjaGlsZDsKICAgICB9CiAgICAgaW50IGEsYjsKICAgICBjaW4+PmE+PmI7CgogICAgIGNvdXQ8PGZpbmREaXN0KHJvb3QsYSxiKTw8ZW5kbDsKCiAgfQogIH0KICByZXR1cm4gMDsKfQo=