Beingamanforever

CF EDU DSU: C: Experience

Oct 25th, 2024
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.71 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. mt19937_64 RNG(chrono::steady_clock::now().time_since_epoch().count());
  4. #define NeedForSpeed                  \
  5.     ios_base::sync_with_stdio(false); \
  6.     cin.tie(NULL);                    \
  7.     cout.tie(NULL);
  8. #define int long long
  9. #define all(x) (x).begin(), (x).end()
  10. typedef vector<int> vi;
  11. typedef vector<bool> vb;
  12. typedef vector<vi> vvi;
  13. typedef vector<pair<int, int>> vpi;
  14. #define f first
  15. #define s second
  16. #define endl "\n"
  17. const int mod = 1000000007;
  18. int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
  19. struct DSU
  20. {
  21.     vector<int> parent, size, points, extra_points;
  22.     DSU(int n) : parent(n), size(n, 1), points(n, 0), extra_points(n, 0)
  23.     {
  24.         for (int i = 0; i < n; ++i)
  25.         {
  26.             parent[i] = i;
  27.         }
  28.     }
  29.     int find(int x) // ultimate parent
  30.     {
  31.         // path compression
  32.         return parent[x] == x ? x : find(parent[x]);
  33.     }
  34.     int get_points(int n)
  35.     {
  36.         int amt = points[n];
  37.         if (parent[n] == n)
  38.         {
  39.             return amt;
  40.         }
  41.         // we have to remove the extra points each node has
  42.         amt += get_points(parent[n]) - extra_points[n];
  43.         return amt;
  44.     }
  45.     void add_points(int n, int toadd)
  46.     {
  47.         // add in the ultimate parent
  48.         // but we would store how much extra did the other parent had while merging
  49.         // so that we dont count it in the final answer
  50.         int top = find(n);
  51.         points[top] += toadd;
  52.     }
  53.     bool unite(int x, int y)
  54.     {
  55.         int xr = find(x), yr = find(y);
  56.         if (xr == yr)
  57.         {
  58.             return false;
  59.         }
  60.         if (size[xr] < size[yr])
  61.         {
  62.             swap(xr, yr);
  63.         }
  64.         parent[yr] = xr;
  65.         size[xr] += size[yr];
  66.         extra_points[yr] = points[xr];
  67.         return true;
  68.     }
  69.     bool islink(int x, int y)
  70.     {
  71.         return find(x) == find(y);
  72.     }
  73.     int getsize(int x)
  74.     {
  75.         return size[find(x)];
  76.     }
  77. };
  78. void solve()
  79. {
  80.     int n, q;
  81.     cin >> n >> q;
  82.     DSU dsu(n);
  83.     while (q--)
  84.     {
  85.         string s;
  86.         cin >> s;
  87.         if (s == "add")
  88.         {
  89.             int n, points;
  90.             cin >> n >> points;
  91.             dsu.add_points(n - 1, points);
  92.         }
  93.         else if (s == "join")
  94.         {
  95.             int n, m;
  96.             cin >> n >> m;
  97.             dsu.unite(n - 1, m - 1);
  98.         }
  99.         else
  100.         {
  101.             int n;
  102.             cin >> n;
  103.             cout << dsu.get_points(n - 1) << endl;
  104.         }
  105.     }
  106.     return;
  107. }
  108.  
  109. signed main()
  110. {
  111.     NeedForSpeed;
  112.     int t = 1;
  113.     // cin >> t;
  114.     while (t--)
  115.     {
  116.         solve();
  117.     }
  118.     return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment