#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e18, MOD = 1e9 + 7, SQRT = 350;
inline void smin(long long &x, long long y) { x = min(x, y); }
inline void smax(long long &x, long long y) { x = max(x, y); }
const long long MAXN = 4e5 + 100;
long long n, m, from[MAXN], to[MAXN], tim, pos[MAXN], c[MAXN], a[MAXN];
vector<long long> adj[MAXN], all;
void dfs(long long v, long long par = -1) {
  pos[v] = tim;
  from[v] = tim++;
  for (auto u : adj[v]) {
    if (u == par) continue;
    dfs(u, v);
  }
  to[v] = tim;
}
struct sgmnt {
  long long seg[MAXN << 2], lazy[MAXN << 2];
  void ff() { fill(lazy, lazy + (MAXN << 2), -1); }
  void build(long long id = 1, long long l = 0, long long r = n) {
    if (r - l < 2) {
      seg[id] = (1LL << c[a[l]]);
      return;
    }
    long long mid = (r + l) >> 1;
    build(id * 2, l, mid);
    build(id * 2 + 1, mid, r);
    seg[id] = seg[id * 2] | seg[id * 2 + 1];
  }
  void pass(long long id) {
    if (lazy[id] == -1) return;
    lazy[id * 2] = lazy[id];
    lazy[id * 2 + 1] = lazy[id];
    seg[id * 2] = (1LL << lazy[id]);
    seg[id * 2 + 1] = (1LL << lazy[id]);
    lazy[id] = -1;
    return;
  }
  void apply(long long x, long long y, long long val, long long id = 1,
             long long l = 0, long long r = n) {
    if (r <= x || l >= y) return;
    if (r <= y && l >= x) {
      lazy[id] = val;
      seg[id] = (1LL << val);
      return;
    }
    pass(id);
    long long mid = (r + l) >> 1;
    apply(x, y, val, id * 2, l, mid);
    apply(x, y, val, id * 2 + 1, mid, r);
    seg[id] = seg[id * 2] | seg[id * 2 + 1];
  }
  long long get(long long x, long long y, long long id = 1, long long l = 0,
                long long r = n) {
    if (r <= x || l >= y) return 0;
    if (r <= y && l >= x) {
      return seg[id];
    }
    pass(id);
    long long mid = (r + l) >> 1;
    return get(x, y, id * 2, l, mid) | get(x, y, id * 2 + 1, mid, r);
  }
} sg;
int main() {
  scanf("%lld%lld", &n, &m);
  for (long long i = 0; i < n; i++) scanf("%lld", &c[i]);
  for (long long i = 0; i < n - 1; i++) {
    long long u, v;
    scanf("%lld%lld", &u, &v);
    adj[--u].push_back(--v), adj[v].push_back(u);
  }
  dfs(0);
  for (long long i = 0; i < n; i++) a[pos[i]] = i;
  sg.ff();
  sg.build();
  while (m--) {
    long long typ;
    scanf("%lld", &typ);
    typ--;
    if (!typ) {
      long long v, col;
      scanf("%lld%lld", &v, &col);
      v--;
      sg.apply(from[v], to[v], col);
    } else {
      long long v;
      scanf("%lld", &v);
      v--;
      long long ans = sg.get(from[v], to[v]);
      int res = 0;
      for (long long i = 0; i <= 61; i++) res += ((ans >> i) & 1);
      all.push_back(res);
    }
  }
  for (auto ans : all) printf("%d\n", ans);
}
