Advertisement
tuki2501

COLOR.cpp

Sep 20th, 2022 (edited)
888
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.85 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 100005;
  5.  
  6. int color[N], root_color[N];
  7.  
  8. struct DSU {
  9.     int n; vector<int> root, hang;
  10.     DSU(int n): n(n), root(n + 1), hang(n + 1) {
  11.         for (int i = 1; i <= n; i++) {
  12.             root[i] = i;
  13.             hang[i] = 1;
  14.         }
  15.     }
  16.     int find(int i) {
  17.         if (i == root[i]) return i;
  18.         return root[i] = find(root[i]);
  19.     }
  20.     bool join(int u, int v) {
  21.         u = find(u); v = find(v);
  22.         if (u == v) return false;
  23.         if (hang[u] == hang[v]) hang[u]++;
  24.         if (hang[u] < hang[v]) swap(u, v);
  25.         root[v] = u;
  26.         return true;
  27.     }
  28. };
  29.  
  30. void solve() {
  31.     memset(color, 0, sizeof(color));
  32.     memset(root_color, 0, sizeof(root_color));
  33.  
  34.     int n, q;
  35.     cin >> n >> q;
  36.     DSU dsu(n);
  37.     for (int i = 1; i <= n; i++) {
  38.         int c; cin >> c;
  39.         color[i] = c;
  40.         if (!root_color[c]) {
  41.             root_color[c] = i;
  42.         }
  43.         else {
  44.             dsu.join(i, root_color[c]);
  45.             root_color[c] = dsu.find(i);
  46.         }
  47.     }
  48.     // color[dsu.find(i)] = mau cua vien i
  49.     // root_color[c] = vien dai dien mau c
  50.     while (q--) {
  51.         int t; cin >> t;
  52.         if (t == 1) {
  53.             int x, y;
  54.             cin >> x >> y;
  55.             int i = root_color[x];
  56.             if (i == 0) continue;
  57.             root_color[x] = 0;
  58.             if (!root_color[y]) {
  59.                 root_color[y] = i;
  60.                 color[i] = y;
  61.             }
  62.             else {
  63.                 dsu.join(i, root_color[y]);
  64.                 i = dsu.find(i);
  65.                 root_color[y] = i;
  66.                 color[i] = y;
  67.             }
  68.         }
  69.         else {
  70.             int i; cin >> i;
  71.             cout << color[dsu.find(i)] << '\n';
  72.         }
  73.     }
  74. }
  75.  
  76. int main() {
  77.     int T; cin >> T;
  78.     while (T--) solve();
  79. }
  80.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement