//递归暴力解 #include <iostream> using namespace std; int n, m; string list[100]; int dfs(char a, char b, int deep) { for (int i = 0; i < n; i++) { if (a == list[i][0]) { if (b == list[i][1] || b == list[i][2]) return deep; int i1 = dfs(list[i][1], b, deep + 1); int i2 = dfs(list[i][2], b, deep + 1); return i1 > i2 ? i1 : i2; } } return 0; } int main() { while (cin >> n >> m) { // 注意 while 处理多个 case for (int i = 0; i < n; i++) { cin >> list[i]; } for (int i = 0; i < m; i++) { char a, b; cin >> a >> b; int i1 = -dfs(a, b, 1); int i2 = dfs(b, a, 1); int deep = i1 != 0 ? i1 : i2; switch (deep) { case 0: cout << "-" << endl; break; case 1: cout << "parent" << endl; break; case -1: cout << "child" << endl; break; case 2: cout << "grandparent" << endl; break; case -2: cout << "grandchild" << endl; break; default: for (int p = 2; p < abs(deep); p++) { cout << "great-"; } if (deep > 0) cout << "grandparent" << endl; else cout << "grandchild" << endl; } } } } // 64 位输出请用 printf("%lld")