#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; ll d(ll x) { return x*x; } // cannot twocolor bool dfs(int at, int par, bool color) { //cerr << "checking " << at << endl; if (visited[at]) return false; visited[at] = true; //cerr << "visiting " << at << endl; for (int neigh : graph[at]) { if (visited[neigh] && allcolor[neigh] == color) return true; } allcolor[at] = color; if (color) { currtrue++; } else { currfalse++; } for(int child : graph[at]) { if (child == par) continue; dfs(child, at, !color); } return false; } 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); bool anspossible = true; rep(i, 0, N) { currtrue = 0; currfalse = 0; if (visited[i]) continue; //cerr << "new component" << endl; if (!dfs(i, -1, false)) { if (abs(currtrue-currfalse) > 0) { //cerr << "comp possible" << endl; cout << "YES" << endl; return 0; } else { //cerr << "comp imposible abs" << endl; anspossible = false; } } else { //cerr << "comp imposible dfs" << endl; anspossible = false; } } cout << "NO" << endl; }