#include #include #include #include #include using namespace std; struct Node; map dic; struct Node { string name; Node* parent; vector child; Node(const string& n, Node* p) : name(n), parent(p) { dic[name] = this; } ~Node() { for(int i = 0; i < (int)child.size(); ++i) delete child[i]; } void addChild(Node* n) { child.push_back(n); } bool isParent(Node* a) { return (parent == a); } bool isSibling(Node* a) { if(parent) { for(int i = 0; i < (int)parent->child.size(); ++i) if(parent->child[i] != this && parent->child[i] == a) return true; } return false; } bool isAncestor(Node* a) { if(parent) return parent == a || parent->isAncestor(a); return false; } }; vector s; void Add(int d, const string& name) { if(s.empty()) { s.push_back(new Node(name, 0)); return; } while(d < (int)s.size()) { s.pop_back(); } Node* n = new Node(name, s.back()); s.back()->addChild(n); s.push_back(n); } bool eval(const char* st) { char a[50], b[50]; if(sscanf(st, "%s is a child of %s", a, b) == 2) { return dic[a]->isParent(dic[b]); } else if(sscanf(st, "%s is the parent of %s", a, b) == 2) { return dic[b]->isParent(dic[a]); } else if(sscanf(st, "%s is a sibling of %s", a, b) == 2) { return dic[a]->isSibling(dic[b]); } else if(sscanf(st, "%s is a descendant of %s", a, b) == 2) { return dic[a]->isAncestor(dic[b]); } else if(sscanf(st, "%s is an ancestor of %s", a, b) == 2) { return dic[b]->isAncestor(dic[a]); } return false; } int main() { int n, m; while(cin >> n >> m >> ws && n) { s.clear(); dic.clear(); for(int i = 0; i < n; ++i) { char line[1000]; cin.getline(line, 1000); int d = 0; for(; line[d] == ' '; ++d); Add(d, line+d); } Node* root = s[0]; for(int i = 0; i < m; ++i) { char st[1000]; cin.getline(st, 1000); int n = strlen(st); st[n-1] = 0; if(eval(st)) { cout << "True" << endl; } else { cout << "False" << endl; } } cout << endl; delete root; } }