hpnq

DSU minmax sz

May 25th, 2022 (edited)
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.18 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define pb push_back
  3. #define all(x) x.begin(), x.end()
  4. #define SIZE 101
  5. typedef long long ll;
  6. using namespace std;
  7. int n, m;
  8.  
  9. vector<int> link;
  10. vector<int> sz;
  11. vector<pair<int, int>> maxmin;
  12. int get(int v)
  13. {
  14.     return  link[v] == v ? v :
  15. link[v] = get(link[v]);
  16. }
  17.  
  18.  
  19. void unite(int a, int b)
  20. {
  21.     a = get(a);
  22.     b = get(b);
  23.     if(a==b) return;
  24.     if(sz[a] < sz[b]) swap(a, b);
  25.     link[b] = a;
  26.     sz[a] += sz[b];
  27.     maxmin[a] = pair<int, int> {max(maxmin[a].first, maxmin[b].first ), min(maxmin[a].second, maxmin[b].second ) };
  28. }
  29.  
  30.  
  31. int main()
  32. {
  33.     cin >> n >> m;
  34.  
  35.     for(int i = 0; i<n; i++ )
  36.     {
  37.         link.pb(i);
  38.         sz.pb(1);
  39.         maxmin.pb(pair<int, int>{i, i});
  40.  
  41.     }
  42.     string s;
  43.     int u, v;
  44.     for(int i = 0; i < m; i++)
  45.     {
  46.         cin >> s;
  47.  
  48.         if(s=="union")
  49.         {
  50.             cin >> u >> v;
  51.             --v, --u;
  52.             unite(u, v);
  53.  
  54.         }else
  55.         {
  56.  
  57.             cin >> u;
  58.             --u;
  59.             int ans = get(u);
  60.             cout << maxmin[ans].second + 1 << " " << maxmin[ans].first + 1 << " " << sz[ans] << '\n';
  61.         }
  62.     }
  63.     return 0;
  64. }
  65.  
  66.  
Add Comment
Please, Sign In to add comment