fork download
  1. /*
  2. * Author: Geeza
  3. */
  4.  
  5. #include <bits/stdc++.h>
  6.  
  7. #define ld long double
  8. #define ll long long
  9. #define pb push_back
  10. #define fin(a, n) for(int i = a; i < n; i++)
  11. #define fjn(a, n) for(int j = a; j < n; j++)
  12. #define all(a) a.begin(),a.end()
  13. #define allr(a) a.rbegin(),a.rend()
  14. #define FAST ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
  15.  
  16. using namespace std;
  17.  
  18. const double PI = acos(-1);
  19. const int N = 100000;
  20. const ll oo = 0x3f3f3f3f3f3f3f3f;
  21. const int MOD = 1000000007, inf = 1e6;
  22.  
  23. string di[] = {"D","L", "U", "R", "UL", "UR", "DL", "DR"};
  24. int dx[] = {+1, +0, +0, -1, -1, -1, +1, +1};
  25. int dy[] = {+0, -1, +1, +0, -1, +1, -1, +1};
  26. char dc[] = {'D', 'L', 'R', 'U'};
  27.  
  28. struct DSU {
  29. vector<ll> parent, size, id;
  30. DSU(ll n) : parent(n + 1), size(n + 1, 1), id(n+1, -1){
  31. iota(parent.begin(), parent.end(), 0);
  32. }
  33.  
  34. ll find(ll x) {
  35. if (x == parent[x]) return x;
  36. return parent[x] = find(parent[x]);
  37. }
  38.  
  39. bool unite(ll x, ll y, ll val) {
  40. x = find(x);
  41. y = find(y);
  42. if (x == y) return false;
  43. id[x] = id[y] = val;
  44. if (size[x] < size[y]) swap(x, y);
  45. parent[y] = x;
  46. size[x] += size[y];
  47. return true;
  48. }
  49. };
  50.  
  51. void solve() {
  52. ll n, q; cin >> n >> q;
  53. DSU dsu(n);
  54. vector<ll> v(n);
  55. map<ll, set<ll>> mp;
  56. map<ll, ll> idx;
  57. fin(0, n) cin >> v[i], mp[v[i]].insert(i), idx[v[i]] = i;
  58.  
  59. for (auto [x, s] : mp) {
  60. ll l = -1;
  61. for (auto i : s) {
  62. if (l == -1) l = i;
  63. dsu.unite(i, l, l);
  64. }
  65. dsu.id[dsu.find(l)] = l;
  66. }
  67.  
  68. fin(0, q) {
  69. int t; cin >> t;
  70. if (t == 1) {
  71. ll x, y; cin >> x >> y;
  72. if (idx.find(x) == idx.end()) continue;
  73. ll lx = dsu.find(idx[x]);
  74. if (idx.find(y) == idx.end()) {
  75. v[idx[x]] = y;
  76. idx[y] = idx[x];
  77. dsu.unite(lx, idx[y], idx[y]);
  78. idx.erase(x);
  79. }
  80. else {
  81. ll ly = dsu.find(idx[y]);
  82. dsu.unite(lx, ly, ly);
  83. idx.erase(x);
  84. }
  85. }
  86. else {
  87. ll x; cin >> x; --x;
  88. cout << v[dsu.id[dsu.find(x)]] << "\n";
  89. }
  90. }
  91. }
  92.  
  93. int main() {
  94. FAST;
  95. #ifndef ONLINE_JUDGE
  96. freopen("input.txt","r",stdin);
  97. freopen("output.txt","w",stdout);
  98. #endif
  99. int tt = 1, c = 1; cin >> tt;
  100. while(tt--){
  101. cout << "Case " << c++ << ":\n";
  102. solve();
  103. }
  104. return 0;
  105. }
Success #stdin #stdout 0s 5324KB
stdin
Standard input is empty
stdout
Case 1: