Advertisement
welleyth

Regional 2022 Day2 E. DSU

Feb 6th, 2022
886
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.44 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4.  
  5. using namespace std;
  6. using namespace __gnu_pbds;
  7.  
  8. #define int long long
  9. #define mp make_pair
  10. #define pb push_back
  11.  
  12. #pragma GCC optimize("Ofast")
  13. #pragma GCC optimize("unroll-loops")
  14.  
  15. constexpr int N = (int)3e3+11;
  16. constexpr int INF = (int)1e18;
  17.  
  18. template<class T> using ordered_set = tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;
  19. mt19937 rnd(time(nullptr));
  20.  
  21. struct DSU{
  22.     vector<int> p;
  23.     vector<ordered_set<int>> vt;
  24.     int sz;
  25.     DSU(){}
  26.     DSU(int n){
  27.         sz = n + 1;
  28.         p.resize(sz);
  29.         vt.resize(sz);
  30.         for(int i = 0; i < sz; i++)
  31.             p[i] = i, vt[i].insert(i);
  32.     }
  33.     int get(int x){
  34.         if(p[x] == x)
  35.             return x;
  36.         return p[x] = get(p[x]);
  37.     }
  38.     void union_sets(int a,int b){
  39.         a = get(a), b = get(b);
  40.         if(a == b)
  41.             return;
  42.         if(vt[a].size() > vt[b].size())
  43.             swap(a,b);
  44.         p[a] = b;
  45.         for(auto& x : vt[a])
  46.             vt[b].insert(x);
  47.         return;
  48.     }
  49.     int answer(int v,int k){
  50.         v = get(v);
  51.         if(vt[v].size() < k)
  52.             return -1;
  53.         return *vt[v].find_by_order(k-1);
  54.     }
  55. };
  56.  
  57. map<int,DSU> d;
  58.  
  59. int n,q,group;
  60. vector<pair<int,pair<int,int>>> Q;
  61.  
  62. DSU get(int x){
  63.     DSU cur(n);
  64. //    cerr << "x = " << x << "\n";
  65.     int i = 1;
  66.     for(int i = 1; i <= x; i++){
  67.         int tp;
  68.         tp = Q[i-1].first;
  69.         if(tp == 2){
  70.             int a,b;
  71.             a = Q[i-1].second.first, b = Q[i-1].second.second;
  72.             cur.union_sets(a,b);
  73.         }
  74.         if(tp == 3){
  75.             int t;
  76.             t = Q[i-1].second.first;
  77.             cur = get(t);
  78.         }
  79.     }
  80. //    cerr << "??? " << cur.get(1) << "\n";
  81.     return cur;
  82. }
  83.  
  84. void solve(){
  85.     cin >> n >> q >> group;
  86.     DSU cur(n);
  87.     d[0] = cur;
  88.     /// LETS MAKE IT OFFLINE
  89.     set<int> QQ;
  90.     for(int i = 0; i < q; i++){
  91.         int tp;
  92.         cin >> tp;
  93.         if(tp == 1){
  94.             int v,k;
  95.             cin >> v >> k;
  96.             Q.pb(mp(1,mp(v,k)));
  97. //            cout << cur.answer(v,k) << "\n";
  98.         }
  99.         if(tp == 2){
  100.             int a,b;
  101.             cin >> a >> b;
  102.             Q.pb(mp(2,mp(a,b)));
  103. //            cur.union_sets(a,b);
  104.         }
  105.         if(tp == 3){
  106.             int x;
  107.             cin >> x;
  108.             Q.pb(mp(3,mp(x,-1)));
  109.             QQ.insert(x);
  110. //            cur = d[x];
  111.         }
  112.  
  113.     }
  114.  
  115.     for(int i = 1; i <= q; i++){
  116.         int tp;
  117.         tp = Q[i-1].first;
  118.         if(tp == 1){
  119.             int v,k;
  120.             v = Q[i-1].second.first, k = Q[i-1].second.second;
  121.             cout << cur.answer(v,k) << "\n";
  122.         }
  123.         if(tp == 2){
  124.             int a,b;
  125.             a = Q[i-1].second.first, b = Q[i-1].second.second;
  126.             cur.union_sets(a,b);
  127.         }
  128.         if(tp == 3){
  129.             int x;
  130.             x = Q[i-1].second.first;
  131.             if(group == 7)
  132.                 cur = get(x);
  133.             else
  134.                 cur = d[x];
  135.         }
  136.         if((group == 0 || group == 3 || group == 6) && QQ.count(i))
  137.             d[i] = cur;
  138. //        cerr << cur.get(1) << "\n";
  139.     }
  140.  
  141.     return;
  142. }
  143.  
  144. signed main(){
  145.     ios::sync_with_stdio(false);cin.tie(nullptr);
  146.  
  147.     int tests = 1;
  148.     for(int test = 1; test <= tests; test++){
  149.         solve();
  150.     }
  151.  
  152.     return 0;
  153. }
  154.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement