Advertisement
Guest User

Untitled

a guest
Jan 21st, 2016
4,459
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.28 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define forn(i, n) for (int i = 0; i < int(n); i++)
  4. #define ford(i, n) for (int i = int(n) - 1; i >= 0; i--)
  5. #define fore(i, l, r) for (int i = int(l); i < int(r); i++)
  6. #define correct(x, y, n, m) (0 <= (x) && (x) < (n) && 0 <= (y) && (y) < (m))
  7. #define all(a) (a).begin(), (a).end()
  8. #define sz(a) int((a).size())
  9. #define pb(a) push_back(a)
  10. #define mp(x, y) make_pair((x), (y))
  11. #define x first
  12. #define y second
  13.  
  14. using namespace std;
  15.  
  16. typedef long long li;
  17. typedef long double ld;
  18. typedef pair<int, int> pt;
  19.  
  20. template<typename X> inline X abs(const X& a) { return a < 0? -a: a; }
  21. template<typename X> inline X sqr(const X& a) { return a * a; }
  22.  
  23. const int INF = int(1e9);
  24. const li INF64 = li(1e18);
  25. const ld EPS = 1e-9, PI = 3.1415926535897932384626433832795;
  26.  
  27. const int N = 1200300;
  28.  
  29. int n, m;
  30. int c[N];
  31. vector<int> g[N];
  32. pair<int, pt> q[N];
  33.  
  34. inline bool read() {
  35.     if (!(cin >> n >> m)) return false;
  36.     forn(i, n) assert(scanf("%d", &c[i]) == 1);
  37.     forn(i, n) g[i].clear();
  38.     forn(i, n - 1) {
  39.         int x, y;
  40.         assert(scanf("%d%d", &x, &y) == 2);
  41.         x--, y--;
  42.         g[x].pb(y), g[y].pb(x);
  43.     }
  44.     forn(i, m) {
  45.         assert(scanf("%d%d", &q[i].x, &q[i].y.x) == 2);
  46.         q[i].y.x--;
  47.         if (q[i].x == 1) {
  48.             assert(scanf("%d", &q[i].y.y) == 1);
  49.             //q[i].y.y--;
  50.         }
  51.     }
  52.     return true;
  53. }
  54.  
  55. int tt, tin[N], tout[N], vs[N];
  56.  
  57. void dfs(int v, int p) {
  58.     vs[tt] = v;
  59.     tin[v] = tt++;
  60.     forn(i, sz(g[v])) if (g[v][i] != p) dfs(g[v][i], v);
  61.     tout[v] = tt;
  62. }
  63.  
  64. li t[4 * N], add[4 * N];
  65.  
  66. void build(int v, int l, int r) {
  67.     add[v] = -1;
  68.     if (l + 1 == r) t[v] = 1ll << c[vs[l]];
  69.     else {
  70.         int md = (l + r) >> 1;
  71.         build(2 * v + 1, l, md);
  72.         build(2 * v + 2, md, r);
  73.         t[v] = t[2 * v + 1] | t[2 * v + 2];
  74.     }
  75. }
  76.  
  77. inline void push(int v) {
  78.     if (add[v] == -1) return;
  79.     fore(i, 1, 3)
  80.         t[2 * v + i] = add[2 * v + i] = add[v];
  81.     add[v] = -1;
  82. }
  83.  
  84. void paint(int v, int l, int r, int lf, int rg, int c) {
  85.     if (lf >= rg) return;
  86.     if (l == lf && r == rg) {
  87.         t[v] = 1ll << c;
  88.         add[v] = 1ll << c;
  89.     } else {
  90.         push(v);
  91.         int md = (l + r) >> 1;
  92.         paint(2 * v + 1, l, md, lf, min(md, rg), c);
  93.         paint(2 * v + 2, md, r, max(lf, md), rg, c);
  94.         t[v] = t[2 * v + 1] | t[2 * v + 2];
  95.     }
  96. }
  97.  
  98. li get(int v, int l, int r, int lf, int rg) {
  99.     if (lf >= rg) return 0;
  100.     if (l == lf && r == rg) return t[v];
  101.     push(v);
  102.     int md = (l + r) >> 1;
  103.     li ans = 0;
  104.     ans |= get(2 * v + 1, l, md, lf, min(md, rg));
  105.     ans |= get(2 * v + 2, md, r, max(lf, md), rg);
  106.     return ans;
  107. }
  108.  
  109. inline void solve() {
  110.     tt = 0;
  111.     dfs(0, -1);
  112.     assert(tt == n);
  113.     build(0, 0, n);
  114.  
  115.     forn(i, m) {
  116.         int tp = q[i].x, v = q[i].y.x;
  117.         if (tp == 1) {
  118.             int c = q[i].y.y;
  119.             paint(0, 0, n, tin[v], tout[v], c);
  120.         } else {
  121.             li mask = get(0, 0, n, tin[v], tout[v]);
  122.             /*cerr << mask << endl;
  123.             cerr << v << ' ' << tin[v] << ' ' << tout[v] << endl;
  124.             fore(i, tin[v], tout[v]) cerr << get(0, 0, n, i, i + 1) << ' '; cerr << endl;*/
  125.             int ans = 0;
  126.             forn(j, 61) ans += int((mask >> j) & 1);
  127.             printf("%d\n", ans);
  128.         }
  129.     }
  130. }
  131.  
  132. int main() {
  133. #ifdef SU1
  134.     assert(freopen("input.txt", "rt", stdin));
  135.     //assert(freopen("output.txt", "wt", stdout));
  136. #endif
  137.    
  138.     cout << setprecision(10) << fixed;
  139.     cerr << setprecision(5) << fixed;
  140.  
  141.     while (read()) {
  142.         solve();
  143.         //break;
  144.     }
  145.    
  146.     return 0;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement