#include using namespace std; using ll = long long; vector> disks; vector> edges; vector color; ll dist2(ll x1, ll y1, ll x2, ll y2){ return (x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1); } bool bipartite(int u){ assert(color[u] != 0); bool flag = true; //printf("node %d has color %d\n", u, color[u]); for(int v : edges[u]){ if(color[v] == 0){ color[v] = 3 - color[u]; flag = flag && bipartite(v); } if(color[v] == color[u]) return false; assert(color[v] = 3 - color[u]); } return flag; } 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()); color.assign(n, 0); 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); } } } bool flag = true; for(int i = 0; i < n; ++i){ if(color[i] == 0){ color[i] = 1; //* if(bipartite(i)){ array count = {0, 0}; for(int c : color) count[c - 1] += 1; if(count[0] != count[1]){ printf("YES"); return 0; } } //*/ /* deque q = {i}; while(!q.empty()){ int u = q.front(); q.pop_front(); for(int v : edges[u]){ if(color[v] == 0){ color[v] = 3 - color[u]; bipartite(v); } if(color[v] == color[u]) return false; color[v] = 3 - color[u]; } } */ } } printf("NO"); }