#include using namespace std; using ll = long long; vector> disks; vector> edges; vector vis; vector color; ll dist2(ll x1, ll y1, ll x2, ll y2){ return (x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1); } int main() { ios::sync_with_stdio(0); cin.tie(0); int n; scanf("%d", &n); disks.assign(n, {0LL, 0LL, 0LL}); edges.assign(n, vector()); vis.assign(n, false); color.assign(n, -1); for(int i = 0; i < n; ++i){ scanf("%lld %lld %lld", &disks[i][0], &disks[i][1], &disks[i][2]); for(int j = 0; j < i; ++j){ if(dist2(disks[i][0], disks[i][1], disks[j][0], disks[j][1]) == (disks[i][2] + disks[j][2])*(disks[i][2] + disks[j][2])){ edges[i].push_back(j); edges[j].push_back(i); //printf("edge %d %d\n", i, j); } } } for(int i = 0; i < n; ++i){ if(!vis[i]){ color[i] = 0; deque q = {i}; vis[i] = true; bool flag = true; array count = {0, 0}; while(!q.empty()){ int u = q.front(); q.pop_front(); count[color[u]] += 1; //printf("node %d has color %d\n", u, color[u]); for(int v : edges[u]){ if(color[u] == color[v]) flag = false; color[v] = 1 - color[u]; if(!vis[v]){ q.push_back(v); vis[v] = true; } } } if(flag && (count[0] != count[1])){ printf("YES"); return 0; } } } printf("NO"); }