int removeStones(vector<vector<int>>& stones) { const int kSize = 10000; DSU dsu(kSize * 2); for (const auto& stone : stones) dsu.Union(stone[0], stone[1] + kSize); unordered_set<int> seen; for (const auto& stone : stones) seen.insert(dsu.Find(stone[0])); return stones.size() - seen.size(); }
int main(){ long n, m; scanf("%ld %ld", &n, &m); std::vector<long> s(m + 1, 0), t(m + 1, 0); for (long p=1; p<=m; p++){scanf("%ld %ld", &s[p], &t[p]);} std::vector<dsu> left(m + 2, dsu(n + 1)), right(m + 2, dsu(n + 1)); for (long p = 1; p <= m; p++){left[p] = left[p - 1]; left[p].join(s[p], t[p]);} for (long p = m; p >= 1; p--){right[p] = right[p + 1]; right[p].join(s[p], t[p]);} long k; scanf("%ld", &k); while(k--){ long l, r; scanf("%ld %ld", &l, &r); dsu u = left[l - 1]; for(long p = 1; p <= n; p++){if(right[r + 1].f[p]){u.join(p, right[r+1].f[p]);}} printf("%ld\n", u.count - 1); //because the nodes are numbered 1 through n, and create a struct of size (n + 1); } return 0; }
double FindOptimalRangeForAgentsRadio(TAgentsVector* agents) { if (agents->size() < 2) { return 0.0; } TEdgeHeap edgeHeap = CreateEdgeHeap(agents); TAgentsDSU dsu(agents->size()); TEdge currentEdge; while (dsu.GetNumberOfClasses() > 1) { currentEdge = edgeHeap.top(); edgeHeap.pop(); dsu.Unite(currentEdge.GetFirstAgentIndex(), currentEdge.GetSecondAgentIndex()); } return currentEdge.GetWeight(); };