// I SELL YOU...! #include #include #include #include #include #include #include #include #include using namespace std; using ll = long long; using P = pair; using TP = tuple; void init_io(){ cin.tie(0); ios::sync_with_stdio(false); cout << fixed << setprecision(18); } class union_find{ int n; vector par,rk,size; public: union_find(int max_n){ n = max_n+1; for(int i=0;i<=n;i++){ par.emplace_back(i); rk.emplace_back(0); size.emplace_back(1); } } int root(int x){ vector nodes; while(x!=par[x]){ nodes.emplace_back(x); x = par[x]; } for(auto v:nodes){ par[v] = x; } return x; } void unite(int x,int y){ x = root(x); y = root(y); if(x==y) return; if(rk[x]> n >> m; vector a(m), b(m); vector used(2*n, false); union_find uf(2*n); for (int i=0;i> a[i] >> b[i]; uf.unite(a[i]-1, b[i]-1); } ll ans = 0; for (int i=0;i<2*n;i++) { ll r = uf.root(i); if (used[r]) continue; used[r] = true; ans += uf.treesize(r) % 2; } cout << ans/2 << endl; }