比自己空格小一个的上一个人就是自己的爸爸
last[级别]存各个代的上一个出现的人
/*
可以用一个数组来维护 当前空格数/2 的那个人 那么 当前空格数/2 - 1 的人就是他父母
*/
#include<iostream>
#include<string>
#include<algorithm> //count函数
#include<map>
using namespace std;
const int N=110;
string last[N];
int n,m;
map<string,string>father;
void pre()
{
cin>>n>>m;
cin.get(); //又双叒叕死在这里
for(int i=1;i<=n;++i)
{
string s;
getline(cin,s);
int cnt=count(s.begin(),s.end(),' ');
if(!cnt)
{
father[s]="root";
last[0]=s; //last记录上一个属于该阶层的人
}
else
{
s=s.substr(cnt);
father[s]=last[cnt/2-1];
last[cnt/2]=s;
}
}
}
int main()
{
pre();
while(m--)
{
string a,b,c,d;
cin>>a>>b>>b>>c>>b>>d;
const char *T="True",*F="False";
switch(c[0])
{
case 'p':
swap(a,d);
case 'c':
cout<<(father[a]==d?T:F)<<endl;
break;
case 's':
cout<<(father[a]==father[d]?T:F)<<endl;
break;
case 'a':
swap(a,d);
case 'd':
while(father[a]!=d&&father[a]!="root") a=father[a];
cout<<(father[a]==d?T:F)<<endl;
}
}
//while(m--){
// string a,b,c,d;
// cin>>a>>d>>d>>b>>d>>c;
// switch(b[0]){
// case 'p': swap(a,c);
// case 'c': cout<<(father[a]==c?T:F)<<endl;
// break;
// case 's': cout<<(father[a]==father[c]?T:F)<<endl;
// break;
// case 'a': swap(a,c);
// case 'd': while(father[a]!=c&&father[a]!="root")a=father[a];
// cout<<(father[a]=="root"?F:T)<<endl;
// } //switch
// } //while
return 0;
}