#include using namespace std; #pragma GCC target("avx2") #pragma GCC optimize("O3") vector gr[1001]; int color[1001]; int ct0 = 0, ct1 = 0; bool bip = 1; void dfs(int node) { if (color[node] == -1) { color[node] = 0; ct0 ++; } else if (color[node] == 0) { ++ct0; } else { ++ct1; } for (auto &x : gr[node]) { if (color[x] != -1 && color[x] == color[node]) { bip = 0; return; } if (color[x] == -1) { color[x] = color[node] ^ 1; dfs(x); } } return; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n; cin >> n; vector x(n), y(n), r(n); for (int i = 0; i < n; ++i) { cin >> x[i] >> y[i] >> r[i]; } vector canchange(n, 1); for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { __int128_t dist = 1ll*(x[i] - x[j])*(x[i] - x[j]); dist += 1ll*(y[i] - y[j])*(y[i] - y[j]); long long r2 = 1ll*(r[i] + r[j])*(r[i] + r[j]); if (dist == r2) { gr[i].emplace_back(j); gr[j].emplace_back(i); } } } for (int i = 0; i < n; ++i) { color[i] = -1; } for (int i = 0; i < n; ++i) { if (color[i] == -1) { ct0 = 0, ct1 = 0; bip = 1; dfs(i); if (bip && ct0 != ct1) { cout << "YES\n"; return 0; } } } cout << "NO\n"; return 0; }