Advertisement
Guest User

nabil1997

a guest
Nov 25th, 2017
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.60 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3.  
  4. #define loop(i,s,e) for(int i = s;i<=e;i++) //including end point
  5.  
  6. #define pb(a) push_back(a)
  7.  
  8. #define sqr(x) ((x)*(x))
  9.  
  10. #define CIN ios_base::sync_with_stdio(0); cin.tie(0);
  11.  
  12. #define ll long long
  13.  
  14. #define ull unsigned long long
  15.  
  16. #define SZ(a) int(a.size())
  17.  
  18. #define read() freopen("input.txt", "r", stdin)
  19.  
  20. #define write() freopen("output.txt", "w", stdout)
  21.  
  22.  
  23. #define ms(a,b) memset(a, b, sizeof(a))
  24.  
  25. #define all(v) v.begin(), v.end()
  26.  
  27. #define PI acos(-1.0)
  28.  
  29. #define pf printf
  30.  
  31. #define sfi(a) scanf("%d",&a);
  32.  
  33. #define sfii(a,b) scanf("%d %d",&a,&b);
  34.  
  35. #define sfl(a) scanf("%lld",&a);
  36.  
  37. #define sfll(a,b) scanf("%lld %lld",&a,&b);
  38.  
  39. #define sful(a) scanf("%llu",&a);
  40.  
  41. #define sfulul(a,b) scanf("%llu %llu",&a,&b);
  42.  
  43. #define sful2(a,b) scanf("%llu %llu",&a,&b); // A little different
  44.  
  45. #define sfc(a) scanf("%c",&a);
  46.  
  47. #define sfs(a) scanf("%s",a);
  48.  
  49. #define getl(s) getline(cin,s);
  50.  
  51. #define mp make_pair
  52.  
  53. #define paii pair<int, int>
  54.  
  55. #define padd pair<dd, dd>
  56.  
  57. #define pall pair<ll, ll>
  58.  
  59. #define vi vector<int>
  60.  
  61. #define vll vector<ll>
  62.  
  63. #define mii map<int,int>
  64.  
  65. #define mlli map<ll,int>
  66.  
  67. #define mib map<int,bool>
  68.  
  69. #define fs first
  70.  
  71. #define sc second
  72.  
  73. #define CASE(t) printf("Case %d: ",++t) // t initialized 0
  74.  
  75. #define cCASE(t) cout<<"Case "<<++t<<": ";
  76.  
  77. #define D(v,status) cout<<status<<" "<<v<<endl;
  78.  
  79. #define INF 1000000000   //10e9
  80.  
  81. #define EPS 1e-9
  82.  
  83. #define flc fflush(stdout); //For interactive programs , flush while using pf (that's why __c )
  84.  
  85. #define CONTEST 1
  86. using namespace std;
  87.  
  88.    
  89.  
  90. int n,m;
  91.     int id[200005];
  92.     //pointers
  93.     int par[200005];
  94.     int sz[200005];
  95.     ll sum[200005];
  96.     int global_id_gen;
  97.     void init(int n) {
  98.     for (int i=1; i<=n; i++) {
  99.         id[i] = i;
  100.         //initially everyone has id = i
  101.         par[i] = id[i];
  102.         // we access each element by it's id, not it's id index
  103.         sz[i] = 1;
  104.         sum[i] = i;
  105.     }
  106.     global_id_gen = n;
  107.     }
  108.     int find_p(int x) {
  109.     //Recursive find_parent gets WA
  110.     //    if(par[x]!=x)
  111.     //        par[x] = find_p(par[x]);
  112.     //
  113.     //    return par[x];
  114.     //But Iterative version gets AC
  115.     int root = x;
  116.     while(par[root]!=root)
  117.             root = par[root];
  118.     int cn = x;
  119.     while(cn!=root) {
  120.         int curp = par[cn];
  121.         par[cn] = root;
  122.         cn = curp;
  123.     }
  124.     return root;
  125.     }
  126.     void unio(int p,int q) {
  127.     int pp = find_p(p);
  128.     int pq = find_p(q);
  129.     if(pp>pq) {
  130.         par[pp] = pq;
  131.         sz[pq] += sz[pp];
  132.         sum[pq] += sum[pp];
  133.     } else if(pp<pq) {
  134.         par[pq] = pp;
  135.         sz[pp] += sz[pq];
  136.         sum[pp] += sum[pq];
  137.     }
  138.     }
  139.     void replac(int p,int q) {
  140.     //move p to q
  141.     //first, delete p from it's original set
  142.     //grab p by it's id
  143.     int pp = find_p(id[p]);
  144.     int pq = find_p(id[q]);
  145.     if(pp==pq)
  146.             return;
  147.     sz[pp]--;
  148.     // p is being deleted
  149.     sum[pp] -= p;
  150.     id[p] = ++global_id_gen;
  151.     //replace old id with
  152.     //id[global_id_gen] = global_id_gen;
  153.     //update pointer
  154.     int new_node = id[p];
  155.     par[new_node] = new_node;
  156.     sz[new_node] = 1 ;
  157.     sum[new_node] = p;
  158.     unio(new_node,id[q]);
  159.     //missed id[q]
  160.     }
  161.     paii szsum(int p) {
  162.     int pp = find_p(p);
  163.     paii ret = mp(sz[pp],sum[pp]);
  164.     return ret;
  165.     }
  166.     int main() {
  167.     //write();
  168.     while(scanf("%d %d",&n,&m)!=EOF) {
  169.         global_id_gen = 0;
  170.         init(n);
  171.         while(m--) {
  172.             int cmd;
  173.             sfi(cmd);
  174.             if(cmd==1) {
  175.                 int p,q;
  176.                 sfii(p,q);
  177.                 p = id[p];
  178.                 q = id[q];
  179.                 unio(p,q);
  180.             } else if(cmd==2) {
  181.                 int p,q;
  182.                 sfii(p,q);
  183.                 //p = id[p];
  184.                 //q = id[q];
  185.                 replac(p,q);
  186.             } else {
  187.                 int p;
  188.                 sfi(p);
  189.                 p = id[p];
  190.                 paii res = szsum(p);
  191.                 pf("%d %lld\n",res.fs,res.sc);
  192.             }
  193.         }
  194.     }
  195.     return 0;
  196.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement