Advertisement
Guest User

Untitled

a guest
Nov 17th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.16 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #define _USE_MATH_DEFINES
  3. #include <stdio.h>
  4. #include <iostream>
  5. #include <string>
  6. #include <map>
  7. #include <set>
  8. #include <algorithm>
  9. #include <vector>
  10. #include <stdio.h>
  11. #include <cmath>
  12. #include <math.h>
  13. #include <math.h>
  14. #include <queue>
  15. #include <stack>
  16. #include <climits>
  17. #include <deque>
  18. #include <ctime>
  19. #include <iomanip>
  20. #include <bitset>
  21. #include <unordered_map>
  22. #include <unordered_set>
  23. #include <fstream>
  24. using namespace std;
  25. typedef long long ll;
  26. typedef unsigned long long ull;
  27. typedef unsigned int ui;
  28. #define sor(n) n.begin(), n.end()
  29. #define rsor(n) n.rbegin(), n.rend()
  30. #define mp make_pair
  31. #define files freopen("input.txt", "rt", stdin); freopen("output.txt", "wt", stdout)
  32. #define p(T) pair<T,T>
  33. #define precis(x) cout.precision(x), cout.setf(ios::fixed)
  34. #define SWS ios::sync_with_stdio(false)
  35. #define CT cin.tie(0), cout.tie(0)
  36.  
  37. const int maxn = 1e7 + 100;
  38. vector<p(int)>s;
  39. int par[maxn];
  40.  
  41. int find_par(int v) {
  42.     if (v == par[v])
  43.         return v;
  44.     return par[v] = find_par(par[v]);
  45. }
  46.  
  47. bool union_sets(int u, int v) {
  48.     int _u = find_par(u);
  49.     int _v = find_par(v);
  50.     if (_u == _v)
  51.         return false;
  52.     par[_v] = _u;
  53.     return true;
  54. }
  55. map<p(int), bool>ff;
  56. int main() {
  57.     SWS; CT;
  58.     int n, m;
  59.     scanf("%d%d", &n, &m);
  60.     for (int i = 1; i <= n; ++i) {
  61.         par[i] = i;
  62.     }
  63.     for (int i = 0; i < m; ++i) {
  64.         int u, v;
  65.         scanf("%d%d", &u, &v);
  66.         s.push_back(mp(u, v));
  67.         ff[mp(u, v)] = 1;
  68.     }
  69.     int q;
  70.     cin >> q;
  71.     vector<int>ans;
  72.     vector<int>edges;
  73.     for (int i = 0; i < q; ++i) {
  74.         int edge;
  75.         scanf("%d", &edge);
  76.         int u = s[edge - 1].first, v = s[edge - 1].second;
  77.         ff[mp(u, v)] = 0;
  78.         edges.emplace_back(edge);
  79.     }
  80.  
  81.     for (int i = 1; i <= m; ++i) {
  82.         int u = s[i - 1].first, v = s[i - 1].second;
  83.         if (ff[mp(u, v)])
  84.             union_sets(u, v);
  85.  
  86.     }
  87.  
  88.     int k = 0;
  89.     for (int j = 1; j <= n; ++j) {
  90.         if (par[j] == j)
  91.             k++;
  92.     }
  93.     ans.push_back(k);
  94.     for (int i = q - 1; i > 0; --i) {
  95.  
  96.         int u = s[edges[i] - 1].first, v = s[edges[i] - 1].second;
  97.  
  98.         if (union_sets(u, v)) {
  99.             k--;
  100.         }
  101.         ans.push_back(k);
  102.     }
  103.  
  104.     for (int i = ans.size() - 1; i >= 0; --i) {
  105.         printf("%d ", ans[i]);
  106.     }
  107.     return 0;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement