#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 800005;
long long c[MAXN];
vector<long long> path[MAXN];
vector<long long> euler;
long long IT[MAXN * 8], lazy[MAXN * 8], Left[MAXN], Right[MAXN], idx = 0;
void dfs(long long u, long long pre) {
  Left[u] = ++idx;
  euler.push_back(u);
  for (long long v : path[u])
    if (v != pre) dfs(v, u);
  euler.push_back(u);
  Right[u] = ++idx;
}
void build(long long l, long long r, long long id) {
  if (l == r) {
    IT[id] = (1ll << c[euler[l]]);
    return;
  }
  long long mid = (l + r) / 2;
  build(l, mid, id * 2);
  build(mid + 1, r, id * 2 + 1);
  IT[id] = IT[id * 2] | IT[id * 2 + 1];
}
void push(long long id) {
  if (lazy[id] != 0) {
    IT[id] = (1ll << lazy[id]);
    lazy[id * 2] = lazy[id];
    lazy[id * 2 + 1] = lazy[id];
  }
  lazy[id] = 0;
}
void upd(long long l, long long r, long long id, long long u, long long v,
         long long val) {
  push(id);
  if (r < u || l > v) return;
  if (l >= u && r <= v) {
    IT[id] = (1ll << val);
    lazy[id * 2] = val;
    lazy[id * 2 + 1] = val;
    return;
  }
  long long mid = (l + r) / 2;
  upd(l, mid, id * 2, u, v, val);
  upd(mid + 1, r, id * 2 + 1, u, v, val);
  IT[id] = IT[id * 2] | IT[id * 2 + 1];
}
long long cnt(long long a) {
  long long res = 0;
  while (a) {
    a &= (a - 1);
    res++;
  }
  return res;
}
long long get(long long l, long long r, long long id, long long u,
              long long v) {
  push(id);
  if (r < u || l > v) return 0;
  if (l >= u && r <= v) return IT[id];
  long long mid = (l + r) / 2;
  return get(l, mid, id * 2, u, v) | get(mid + 1, r, id * 2 + 1, u, v);
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  long long n, m;
  cin >> n >> m;
  for (long long i = 1; i <= n; i++) cin >> c[i];
  for (long long i = 1; i < n; i++) {
    long long u, v;
    cin >> u >> v;
    path[u].push_back(v);
    path[v].push_back(u);
  }
  euler.push_back(0);
  dfs(1, 1);
  build(1, 2 * n, 1);
  for (long long i = 1; i <= m; i++) {
    long long t;
    cin >> t;
    if (t == 1) {
      long long u, c;
      cin >> u >> c;
      upd(1, 2 * n, 1, Left[u], Right[u], c);
    } else {
      long long u;
      cin >> u;
      cout << cnt(get(1, 2 * n, 1, Left[u], Right[u])) << "\n";
    }
  }
}
