#include <bits/stdc++.h>
using namespace std;
const int maxn = 4e5 + 10;
int n, s[maxn], f[maxn], col[maxn], q, l, p[maxn], id, pos, val;
long long mask[4 * maxn], fil[4 * maxn], ans;
vector<int> e[maxn];
void dfs(int x, int rx) {
  s[x] = l;
  p[l] = x;
  l++;
  for (vector<int>::iterator it = e[x].begin(); it != e[x].end(); it++) {
    if (*it != rx) {
      dfs(*it, x);
    }
  }
  f[x] = l - 1;
}
void pushdown(int l, int r, int k) {
  if (l == r) return;
  if (fil[k] == 0) return;
  int k1 = k << 1;
  int k2 = k1 + 1;
  mask[k1] = mask[k2] = fil[k1] = fil[k2] = fil[k];
  fil[k] = 0;
  return;
}
void update(int l, int r, int u, int v, int c, int k) {
  if (r < u || v < l) return;
  if (u <= l && r <= v) {
    mask[k] = 1LL << c;
    fil[k] = 1LL << c;
    return;
  }
  pushdown(l, r, k);
  update(l, (l + r) >> 1, u, v, c, k << 1);
  update(((l + r) >> 1) + 1, r, u, v, c, (k << 1) | 1);
  mask[k] = mask[k << 1] | mask[(k << 1) | 1];
}
long long get(int l, int r, int u, int v, int k) {
  if (r < u || v < l) return 0;
  if (u <= l && r <= v) return mask[k];
  pushdown(l, r, k);
  return get(l, (l + r) >> 1, u, v, k << 1) |
         get(((l + r) >> 1) + 1, r, u, v, (k << 1) | 1);
}
int main() {
  scanf("%d%d", &n, &q);
  l = 1;
  for (int i = 1; i <= n; i++) scanf("%d", &col[i]);
  for (int u, v, i = 1; i < n; i++) {
    scanf("%d%d", &u, &v);
    e[u].push_back(v);
    e[v].push_back(u);
  }
  dfs(1, 0);
  for (int i = 1; i <= n; i++) {
    update(1, n, s[i], s[i], col[i] - 1, 1);
  }
  while (q--) {
    scanf("%d%d", &id, &pos);
    if (id == 1) {
      scanf("%d", &val);
      val--;
      update(1, n, s[pos], f[pos], val, 1);
    } else {
      ans = get(1, n, s[pos], f[pos], 1);
      printf("%d\n", __builtin_popcountll(ans));
    }
  }
}
