#include #include #include using namespace std; int Lookup(vector& map, string cname){ for(int i = 0; i < map.size(); i++) if(map[i] == cname) return i; map.push_back(cname); return map.size()-1; } void Compute_Closure(vector >& is_a, vector >& closure){ for(int i = 0; i < closure.size(); i++){ for(int j = 0; j < closure.size(); j++){ closure[i][j] = is_a[i][j]; } } for(int k =0; k < closure.size(); k++){ for(int i = 0; i < closure.size(); i++){ for(int j = 0; j < closure.size(); j++){ if(closure[i][k] && closure[k][j]) closure[i][j] = true; } } } } int main(){ int n, m; cin >> n >> m; vector map; vector > is_a(500); vector > has_a(500); for(int i = 0; i < 500; i++){ is_a[i].resize(500, false); has_a[i].resize(500, false); } for(int i = 0; i < n; i++){ string c1, r, c2; cin >> c1 >> r >> c2; int c1_id = Lookup(map, c1); int c2_id = Lookup(map, c2); if(r == "is-a") is_a[c1_id][c2_id] = true; else has_a[c1_id][c2_id] = true; } vector > isa_Closure(map.size()); for(int i = 0; i < map.size(); i++) isa_Closure[i].resize(map.size(), false); Compute_Closure(is_a, isa_Closure); vector > hasa_Closure(map.size()); for(int i = 0; i < map.size(); i++){ hasa_Closure[i].resize(map.size(), false); } for(int i = 0; i < map.size(); i++) for(int j = 0; j < map.size(); j++){ if(has_a[i][j]) hasa_Closure[i][j] = true; for(int k = 0; k < map.size(); k++){ if(has_a[i][j] && isa_Closure[j][k]) hasa_Closure[i][k] = true; if(isa_Closure[i][k] && has_a[k][j]) hasa_Closure[i][j] = true; } } for(int k = 0; k < map.size(); k++) for(int i = 0; i < map.size(); i++) for(int j = 0; j < map.size(); j++){ if(hasa_Closure[i][k] && hasa_Closure[k][j]) hasa_Closure[i][j] = true; else{ for(int l = 0; l < map.size(); l++) if(isa_Closure[k][l] && hasa_Closure[i][k] && hasa_Closure[l][j]) hasa_Closure[i][j] = true; } } for(int i = 0; i < m; i++){ string c1, r, c2; cin >> c1 >> r >> c2; int c1_id = Lookup(map, c1); int c2_id = Lookup(map, c2); cout << "Query " << i+1 << ": "; if(r == "is-a"){ if(isa_Closure[c1_id][c2_id] || c1_id == c2_id) cout << "true" << endl; else cout << "false" << endl; } else { // has-a bool found = false; int i = 0; /* while(i < map.size() && !found){ if(isa_Closure[c1_id][i] && hasa_Closure[i][c2_id] || hasa_Closure[c1_id][i] && isa_Closure[i][c2_id]){ found = true; } i++; } */ if(hasa_Closure[c1_id][c2_id]) found = true; if(found) cout << "true" << endl; else cout << "false" << endl; } } return 0; }