Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <iostream>
- #include <cstring>
- #include <cmath>
- #include <tuple>
- #include <string>
- #include <vector>
- #include <queue>
- #include <map>
- #include <stack>
- #include <set>
- #include <bitset>
- #include <algorithm>
- #include <functional>
- #include <deque>
- #include <list>
- #define INF 1000000000
- #define mod 1000000007
- #define PI 3.14159265358979323846
- using namespace std;
- int dsuParent[100005];
- int dsuGetSet(int v)
- {
- if(dsuParent[v] == v)
- return v;
- return dsuParent[v] = dsuGetSet(dsuParent[v]);
- }
- void dsuMergeSet(int u, int v)
- {
- u = dsuGetSet(u);
- v = dsuGetSet(v);
- if(u != v)
- dsuParent[u] = v;
- }
- struct Edge
- {
- Edge () : u(0), v(0) {}
- Edge(int u, int v) : u(u), v(v) {}
- int u, v;
- } edges[100005];
- int order[100005];
- int ans[100005];
- bool used[100005];
- int main()
- {
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- //freopen("output.txt", "w", stdout);
- #endif
- int n, m;
- scanf("%d%d", &n, &m);
- for(int i = 0; i < n; i++)
- {
- dsuParent[i] = i;
- }
- for(int i = 0; i < m; i++)
- {
- scanf("%d%d", &edges[i].u, &edges[i].v);
- edges[i].u--, edges[i].v--;
- }
- int q;
- scanf("%d", &q);
- for(int i = 0; i < q; i++)
- {
- scanf("%d", &order[i]);
- order[i]--;
- used[order[i]] = true;
- }
- int r = n;
- for(int i = 0; i < m; i++)
- {
- if(!used[i])
- {
- int u, v, a, b;
- u = edges[order[i]].u;
- v = edges[order[i]].v;
- a = dsuGetSet(u);
- b = dsuGetSet(v);
- if(a != b)
- {
- dsuMergeSet(edges[i].u, edges[i].v);
- r--;
- }
- }
- }
- for(int i = q - 1; i >= 0; i--)
- {
- ans[i] = r;
- int u, v, a, b;
- u = edges[order[i]].u;
- v = edges[order[i]].v;
- a = dsuGetSet(u);
- b = dsuGetSet(v);
- if(a != b)
- {
- r--;
- dsuMergeSet(a, b);
- }
- }
- for(int i = 0; i < q; i++)
- {
- printf("%d ", ans[i]);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement