#include using namespace std; #define rep(i, a, b) for(int i = a; i < (b); i++) #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() typedef long long ll; typedef pair pii; typedef vector vi; int N; vi x; vi y; vi r; vector> graph; vector visited; vector allcolor; int currtrue; int currfalse; bool cannottwocolor; ll d(ll x) { return x*x; } // cannot twocolor void dfs_problem(int at, int par, bool color) { //cerr << "checking " << at << endl; if (visited[at] && allcolor[at] != color) { cannottwocolor = true; return; } if (visited[at]) return; visited[at] = true; //cerr << "visiting " << at << endl; for (int neigh : graph[at]) { if (visited[neigh] && allcolor[neigh] == color) { cannottwocolor = true; } } allcolor[at] = color; if (color) { currtrue++; } else { currfalse++; } for(int child : graph[at]) { if (child == par) continue; dfs_problem(child, at, !color); } } int main() { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); cin >> N; x = vi(N); y = vi(N); r = vi(N); rep(i, 0, N) { cin >> x[i] >> y[i] >> r[i]; } graph = vector>(N); rep(i, 0, N) { rep(j, 0, i) { if (d(x[i]-x[j]) + d(y[i]-y[j]) == d(r[i]+r[j])) { // tangent graph[i].push_back(j); graph[j].push_back(i); } } } visited = vector(N); allcolor = vector(N); rep(i, 0, N) { if (visited[i]) continue; currtrue = 0; currfalse = 0; cannottwocolor = false; //cerr << "new component" << endl; dfs_problem(i, -1, false); if (!cannottwocolor) { if (currtrue != currfalse) { //cerr << "comp possible" << endl; cout << "YES" << endl; return 0; } else { //cerr << "comp imposible diffnumcolor" << endl; } } else { //cerr << "comp imposible twocolor" << endl; } } cout << "NO" << endl; }