#include #include using namespace std; typedef long long int ll; #define x first #define y second vector parent; int find(int v){ if (parent[v] == v){ return v; } int k = find(parent[v]); parent[v] = k; return k; } bool Union(int v, int w){ int pv = find(v); int pw = find(w); if (pv != pw){ parent[pv] = pw; return false; } return true; } int main(){ ll n, x1, y1, x2, y2, i1, i2, answer = 3; cin >> n; map, int> pointToI; vector> vertices; vector> iedges(2*n); set> edges; vector> iEdgeList; for (int i=0; i> x1 >> y1 >> x2 >> y2; edges.emplace(x1, y1, x2, y2); edges.emplace(x2, y2, x1, y1); if (pointToI.count({x1, y1})) { i1 = pointToI[{x1, y1}]; } else { i1 = pointToI[{x1, y1}] = pointToI.size(); vertices.emplace_back(x1, y1); } if (pointToI.count({x2, y2})) { i2 = pointToI[{x2, y2}]; } else { i2 = pointToI[{x2, y2}] = pointToI.size(); vertices.emplace_back(x2, y2); } iedges[i1].push_back(i2); iedges[i2].push_back(i1); iEdgeList.emplace_back(i1, i2); } int v = pointToI.size(); for (int i=0; i= 2){ for (int i=0; i= 2; i++){ auto [x, y] = vertices[i]; int DR [] = {1, 0, -1, 0}; int DC [] = {0, 1, 0, -1}; for (int dd=0; dd<4; dd++){ ll x2 = x + DR[dd]; ll y2 = y + DC[dd]; auto it = pointToI.find({x2, y2}); if (it != pointToI.end() && std::find(iedges[i].begin(), iedges[i].end(), it->second) == iedges[i].end() && find(i) == find(it->second)) { answer = 1; } } } } cout << answer << '\n'; }