Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #define _USE_MATH_DEFINES
- #include <stdio.h>
- #include <iostream>
- #include <string>
- #include <map>
- #include <set>
- #include <algorithm>
- #include <vector>
- #include <stdio.h>
- #include <cmath>
- #include <math.h>
- #include <math.h>
- #include <queue>
- #include <stack>
- #include <climits>
- #include <deque>
- #include <ctime>
- #include <iomanip>
- #include <bitset>
- #include <unordered_map>
- #include <unordered_set>
- #include <fstream>
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef unsigned int ui;
- #define sor(n) n.begin(), n.end()
- #define rsor(n) n.rbegin(), n.rend()
- #define mp make_pair
- #define files freopen("input.txt", "rt", stdin); freopen("output.txt", "wt", stdout)
- #define p(T) pair<T,T>
- #define precis(x) cout.precision(x), cout.setf(ios::fixed)
- #define SWS ios::sync_with_stdio(false)
- #define CT cin.tie(0), cout.tie(0)
- const int maxn = 1e7 + 100;
- vector<p(int)>s;
- int par[maxn];
- int find_par(int v) {
- if (v == par[v])
- return v;
- return par[v] = find_par(par[v]);
- }
- bool union_sets(int u, int v) {
- int _u = find_par(u);
- int _v = find_par(v);
- if (_u == _v)
- return false;
- par[_v] = _u;
- return true;
- }
- map<p(int), bool>ff;
- int main() {
- SWS; CT;
- int n, m;
- scanf("%d%d", &n, &m);
- for (int i = 1; i <= n; ++i) {
- par[i] = i;
- }
- for (int i = 0; i < m; ++i) {
- int u, v;
- scanf("%d%d", &u, &v);
- s.push_back(mp(u, v));
- ff[mp(u, v)] = 1;
- }
- int q;
- cin >> q;
- vector<int>ans;
- vector<int>edges;
- for (int i = 0; i < q; ++i) {
- int edge;
- scanf("%d", &edge);
- int u = s[edge - 1].first, v = s[edge - 1].second;
- ff[mp(u, v)] = 0;
- edges.emplace_back(edge);
- }
- for (int i = 1; i <= m; ++i) {
- int u = s[i - 1].first, v = s[i - 1].second;
- if (ff[mp(u, v)])
- union_sets(u, v);
- }
- int k = 0;
- for (int j = 1; j <= n; ++j) {
- if (par[j] == j)
- k++;
- }
- ans.push_back(k);
- for (int i = q - 1; i > 0; --i) {
- int u = s[edges[i] - 1].first, v = s[edges[i] - 1].second;
- if (union_sets(u, v)) {
- k--;
- }
- ans.push_back(k);
- }
- for (int i = ans.size() - 1; i >= 0; --i) {
- printf("%d ", ans[i]);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement