Advertisement
Zeinab_Hamdy

Untitled

Sep 4th, 2024
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.70 KB | None | 0 0
  1. //  #### Zeinab
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. #define nl "\n"
  5. #define fi first
  6. #define se second
  7. #define pb push_back
  8. #define ll long long
  9. #define RV return void
  10. #define sz(x) int(x.size())
  11. #define all(v) v.begin(), v.end()
  12. #define rall(v) v.rbegin(), v.rend()
  13. #define cin(v) for(auto&x:v) cin >> x;
  14. #define cout(v) for(auto&x:v) cout << x << " ";
  15.  
  16. int n , m , type , p , q;
  17.  
  18. struct DSU{
  19.     vector < int > Leader  , Size , Sum ;
  20.     DSU(int mxSize){
  21.         Leader.assign(mxSize+5 , 0);
  22.         Size.assign(mxSize+5 , 1);
  23.         Sum.assign(mxSize+5 , 0);
  24.  
  25.         for(int i=0 ; i<=mxSize ; i++)
  26.             Leader[i]=i   , Sum[i]=i;
  27.     }
  28.  
  29.     int FindLeader(int node){
  30.         if(Leader[node]==node)
  31.             return node;
  32.         return Leader[node]=FindLeader(Leader[node]);
  33.     }
  34.  
  35.     bool SameGroup(int u , int v ){
  36.         return FindLeader(u)==FindLeader(v);
  37.     }
  38.  
  39.     void MergeGroups(int u , int v ){
  40.         int LeaderU = FindLeader(u);
  41.         int LeaderV = FindLeader(v);
  42.         if(LeaderU==LeaderV) return;
  43.        
  44.         if(Size[LeaderV] > Size[LeaderU])
  45.             swap(LeaderU , LeaderV) , swap(u,v);
  46.  
  47.         Leader[v]=LeaderU;
  48.         Size[LeaderU] +=Size[LeaderV];
  49.         Sum[LeaderU] += Sum[LeaderV];
  50.  
  51.         Size[LeaderV]=0;
  52.         Sum[LeaderV]=0;
  53.     }
  54.  
  55.     void Move(int u , int v){
  56.         //  move u to v
  57.         int LeaderU = FindLeader(u);
  58.         int LeaderV = FindLeader(v);
  59.         if(LeaderU==LeaderV) return;
  60.        
  61.  
  62.         Leader[u]=LeaderV;
  63.         Size[LeaderV] ++;
  64.         Sum[LeaderV] += u;
  65.  
  66.         Sum[LeaderU]  -=u;
  67.         Size[LeaderU] --;
  68.     }
  69. };
  70.  
  71.  
  72. void solve(){
  73.  
  74.     // union , move , return;
  75.  
  76.  
  77.     while(cin >> n >> m){
  78.         DSU d(n);
  79.         while(m--){
  80.             cin >> type;
  81.             if(type==1){
  82.                 cin >> p >> q;
  83.                 // marge
  84.                 d.MergeGroups(p,q);
  85.             }else if(type==2){
  86.                 cin >> p >> q;
  87.                 // move
  88.                 d.Move(p,q);
  89.             }else{
  90.                 cin >> p;
  91.                 int leader = d.FindLeader(p);
  92.                 cout << d.Size[leader] << " "<< d.Sum[leader] << nl;
  93.             }
  94.  
  95.             // for(int i =1 ; i <= 5; i++){
  96.             //     cout << i << " " << d.FindLeader(i) << " "<<d.Sum[ d.FindLeader(i)] << " " << d.Size[ d.FindLeader(i)] << nl;
  97.             // }
  98.             // cout << nl << nl;
  99.         }
  100.     }
  101.  
  102.  
  103.  
  104. }
  105.  
  106. int main(){
  107.     ios_base::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);  
  108.  
  109.  
  110.     int t=1;
  111.         // cin >> t ;
  112.     for(int i=1 ; i <= t ; i++){
  113.         // cout << "Case "<< i <<": " ;
  114.         solve();
  115.     }
  116.     return 0;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement