#include using namespace std; using ll = long long; vector> adj; vector> disks; ll getDist(int i, int j) { return (disks[i][0] - disks[j][0]) * (disks[i][0] - disks[j][0]) + (disks[i][1] - disks[j][1]) * (disks[i][1] - disks[j][1]); } ll areTangent(int i, int j) { return getDist(i, j) == (disks[i][2] + disks[j][2]) * (disks[i][2] + disks[j][2]); } vector col; bool isOk(int node, int curCol, int& res) { if (col[node] != 0) return true; col[node] = curCol; res += curCol; bool ok = true; for (int next : adj[node]) { if (col[next] == 0) { ok = ok && isOk(next, -curCol, res); } if (col[next] != -curCol) ok = false; } return ok; } int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; adj.resize(n); col.assign(n, 0); disks.resize(n); for (int i = 0; i < n; i++) { int x, y, r; cin >> x >> y >> r; disks[i] = {x, y, r}; } for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (areTangent(i, j)) { adj[i].push_back(j); adj[j].push_back(i); } } } for (int i = 0; i < n; i++) { if (col[i] == 0) { int res = 0; if (isOk(i, 1, res) && res != 0) { cout << "YES\n"; return 0; } } } cout << "NO\n"; }