Advertisement
Hippskill

Untitled

Jan 21st, 2016
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.59 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #include<iostream>
  4. #include<vector>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<memory.h>
  8. #include<map>
  9. #include<set>
  10. #include<queue>
  11. #include<list>
  12. #include<sstream>
  13. #include<cstring>
  14. #include<numeric>
  15. using namespace std;
  16.  
  17. const int N = 4e5;
  18.  
  19. vector<int> g[N];
  20.  
  21. int a[N];
  22.  
  23. long long ans[N];
  24. int pushing[N];
  25. int p[N];
  26.  
  27. int root = -1;
  28. bool u[N];
  29.  
  30.  
  31. int bitCount(long long a) {
  32.     int res = 0;
  33.     while (a > 0) {
  34.         if (a % 2 != 0) {
  35.             res++;
  36.         }
  37.         a >>= 1;
  38.     }
  39.     return res;
  40. }
  41.  
  42. int query(int v){
  43.     return bitCount(ans[v]);
  44. }
  45.  
  46. void upd(int v, int c) {
  47.     ans[v] = 1 << c;
  48.     while (p[v] != -1) {
  49.         v = p[v];
  50.         ans[v] = 0;
  51.         for (auto to : g[v]) {
  52.             ans[v] |= ans[to];
  53.         }
  54.     }
  55. }
  56.  
  57. void build(int v) {
  58.     u[v] = true;
  59.     ans[v] = 1 << a[v];
  60.     for (auto to : g[v]) {
  61.         if (!u[to]) {
  62.             p[to] = v;
  63.             build(to);
  64.             ans[v] |= ans[to];
  65.         }
  66.     }
  67. }
  68.  
  69. void addEdge(int a, int b) {
  70.     g[a].push_back(b);
  71.     g[b].push_back(a);
  72. }
  73.  
  74. int main() {
  75. #ifndef ONLINE_JUDGE
  76.     freopen("input.txt", "r", stdin);
  77. #endif
  78.     int n, m;
  79.     scanf("%d%d", &n, &m);
  80.     for (int i = 0; i < n; i++) {
  81.         scanf("%d", &a[i]);
  82.     }
  83.     fill_n(p, N, -1);
  84.     for (int i = 0; i < n - 1; i++) {
  85.         int a, b;
  86.         scanf("%d%d", &a, &b);
  87.         if (root == -1) {
  88.             root = a - 1;
  89.         }
  90.         addEdge(a - 1, b - 1);
  91.     }
  92.  
  93.     build(root);
  94.  
  95.     for (int i = 0; i < m; i++) {
  96.         int t;
  97.         scanf("%d", &t);
  98.         if (t == 1) {
  99.             int v, c;
  100.             scanf("%d%d", &v, &c);
  101.             upd(v - 1, c);
  102.         }
  103.         else {
  104.             int v;
  105.             scanf("%d", &v);
  106.             printf("%d\n", query(v - 1));
  107.         }
  108.     }
  109.  
  110.     return 0;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement