Advertisement
mehedi1

preli-dhaka-19-B

Sep 30th, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.12 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #include<ext/pb_ds/assoc_container.hpp>
  3. using namespace std;
  4. using namespace __gnu_pbds;
  5. const int mxn = 1e5+5;
  6. int par[mxn];
  7.  
  8. template<typename T> using orderedSet =
  9.     tree<T, null_type, less_equal<T>, // less_equal for multiset
  10.     rb_tree_tag, tree_order_statistics_node_update>;
  11. orderedSet<int> os[mxn];
  12.  
  13. int find_par(int u) {
  14.     if(par[u] == u) return u;
  15.     return par[u] = find_par(par[u]);
  16. }
  17. void union_sets(int a,int b) {
  18.     int x = find_par(a);
  19.     int y = find_par(b);
  20.     if(x != y) {
  21.         if(os[x].size() < os[y].size()) swap(x, y); // setting os[x] = bigger_set, os[y] = smaller_set
  22.         for(auto it=os[y].begin();it!=os[y].end();++it) { //copying elements, smaller to bigger one
  23.             os[x].insert(*it);
  24.         }
  25.         par[y] = x;
  26.     }
  27. }
  28. int search(int a, int l, int r) {
  29.     int x=find_par(a);
  30.     int n2 = os[x].order_of_key(r+1); // elements less than (r+1)
  31.     int n1 = os[x].order_of_key(l); // elements less than l
  32.     return n2-n1;
  33. }
  34.  
  35. int main() {
  36.     int a,b,n,T,cas=0,typ,t,l,r,q;
  37.     scanf("%d",&T);
  38.     while(T--) {
  39.         scanf("%d %d",&n, &q);
  40.         for(int i=1;i<=n;++i) {
  41.             par[i]=i;
  42.             os[i].clear();
  43.         }
  44.         printf("Case %d:\n", ++cas);
  45.         while(q--) {
  46.             scanf("%d",&typ);
  47.             if(typ==0) {
  48.                 scanf("%d %d",&a,&b);
  49.                 union_sets(a,b);
  50.             }
  51.             else if(typ==1) {
  52.                 scanf("%d %d",&a, &t);
  53.                 int x=find_par(a);
  54.                 os[x].insert(t);
  55.             }
  56.             else {
  57.                 scanf("%d %d %d",&a,&l,&r);
  58.                 int res = search(a,l,r);
  59.                 printf("%d\n", res);
  60.             }
  61.         }
  62.         // for(int i=1;i<=n;++i) {
  63.         //     printf("%d -> parent: %d, elements: ",i,par[i]);
  64.         //     for(auto it=os[i].begin();it!=os[i].end();++it) printf("%d ", *it);
  65.         //     printf("\n");
  66.         // }
  67.     }
  68.     return 0;
  69. }
  70.  
  71. /*
  72. 2
  73. 3 6
  74. 1 2 7
  75. 2 1 1 10
  76. 0 2 1
  77. 2 1 1 10
  78. 1 2 1
  79. 2 1 1 10
  80. 3 7
  81. 1 3 2
  82. 1 1 100
  83. 1 1 2
  84. 0 1 3
  85. 0 2 1
  86. 2 2 1 10
  87. 2 1 2 2
  88. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement