Advertisement
Vince14

/<> 17469

Oct 5th, 2023
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.93 KB | Source Code | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <vector>
  7. #include <set>
  8. #include <map>
  9. #include <stack>
  10. #include <queue>
  11. #include <deque>
  12. #include <unordered_map>
  13. #include <numeric>
  14. #include <iomanip>
  15. using namespace std;
  16. #define pii pair<int , int>
  17. #define ll long long
  18. #define FAST ios_base::sync_with_stdio(false); cin.tie(NULL)
  19. const long long dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
  20. const long long dl[2] = {1, -1};
  21. const long long MOD = 1000000007;
  22. const long long MAXN = 100005;
  23.  
  24. int N, Q;
  25. vector<pii> q;
  26. vector<int> ans;
  27. int par[MAXN];
  28. int color[MAXN];
  29. int unionp[MAXN];
  30. int sz[MAXN];
  31.  
  32. set<int> colors[MAXN];
  33.  
  34. void init(){
  35.     for(int i = 1; i <= N; i++){
  36.         unionp[i] = i;
  37.         sz[i] = 1;
  38.         colors[i].insert(color[i]);
  39.     }
  40. }
  41.  
  42. int Find(int x){
  43.     if(x == unionp[x]){
  44.         return x;
  45.     }
  46.     return unionp[x] = Find(unionp[x]);
  47. }
  48. void Union(int a, int b){
  49.     a = Find(a);
  50.     b = Find(b);
  51.     if(a == b){
  52.         return;
  53.     }
  54.     if(sz[a] > sz[b]){
  55.         swap(a, b);
  56.     }
  57.     unionp[a] = b;
  58.     colors[b].merge(colors[a]);
  59.     sz[b] += sz[a];
  60. }
  61.  
  62. int Color(int x){
  63.     x = Find(x);
  64.     return colors[x].size();
  65. }
  66.  
  67. int main() {
  68.     FAST;
  69.     cin >> N >> Q;
  70.     for(int i = 2; i <= N; i++){
  71.         cin >> par[i];
  72.     }
  73.     for(int i = 1; i <= N; i++){
  74.         cin >> color[i];
  75.     }
  76.     init();
  77.     for(int x, y, i = 0; i < Q + N - 1; i++){
  78.         cin >> x >> y;
  79.         q.push_back({x, y});
  80.     }
  81.     reverse(q.begin(), q.end());
  82.     for(auto x : q){
  83.         if(x.first == 1){
  84.             Union(x.second, par[x.second]);
  85.         }
  86.         else{
  87.             ans.push_back(Color(x.second));
  88.         }
  89.     }
  90.     reverse(ans.begin(), ans.end());
  91.     for(auto x : ans){
  92.         cout << x << "\n";
  93.     }
  94. }
  95.  
  96. /*
  97. 5 4
  98. 5
  99. 2
  100. 2
  101. 1
  102. 1
  103. 3
  104. 2
  105. 3
  106. 3
  107. 1 4
  108. 2 1
  109. 2 3
  110. 1 2
  111. 2 5
  112. 1 5
  113. 2 3
  114. 1 3
  115.  */
  116.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement