#include #include using namespace std; vector > graph; vector > points; vector rays; vector color; vector visited; pair dfs(int root, bool sd) { visited[root] = true; color[root] = sd; bool can = true; pair res = make_pair(0, 0); if(sd == 0) res.first++; else res.second++; for(auto u : graph[root]) { if(!visited[u]) { pair p = dfs(u, !sd); if(p.first == -1) can = false; res.first += p.first; res.second += p.second; }else { if(color[u] == color[root]) { can = false; } } } return ((can) ? res : make_pair(-1, -1)); } int main() { int n; cin >> n; long long x, y, r; graph.resize(n); points.resize(n); rays.resize(n); for(int i = 0; i < n; i++) { cin >> x >> y >> r; points[i] = make_pair(x, y); rays[i] = r; } for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { if(i >= j) continue; long long x1 = points[i].first; long long y1 = points[i].second; long long x2 = points[j].first; long long y2 = points[j].second; long long r1 = rays[i]; long long r2 = rays[j]; r = r1 + r2; long long d = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2); if(r * r == d) { graph[i].push_back(j); graph[j].push_back(i); } } } bool can = false; visited.resize(n); color.resize(n); for(int i = 0; i < n; i++) { if(!visited[i]) { pair p = dfs(i, 0); if(p.first != -1 && p.first!= p.second) { can = true; break; } } } cout << ((can) ? "YES" : "NO") << endl; return 0; }