#include <bits/stdc++.h>
using namespace std;
using namespace std;
const int maxn = 2e6 + 7;
int num, head[maxn], tot = 1, le[maxn], ri[maxn], id[maxn];
int n, a[maxn], q, val[maxn], la[maxn];
long long sum[maxn];
struct node {
  int v, next;
} e[maxn];
void add(int u, int v) {
  e[num].v = v;
  e[num].next = head[u];
  head[u] = num++;
}
void dfs(int u, int pre) {
  le[u] = tot++;
  val[tot - 1] = u;
  for (int i = head[u]; i != -1; i = e[i].next) {
    int to = e[i].v;
    if (to == pre) continue;
    dfs(to, u);
  }
  ri[u] = tot - 1;
}
void pushup(int rt) { sum[rt] = sum[rt << 1] | sum[rt << 1 | 1]; }
void pushdown(int l, int r, int rt) {
  if (la[rt] == -1) return;
  sum[rt << 1] = (1ll << la[rt]);
  sum[rt << 1 | 1] = (1ll << la[rt]);
  la[rt << 1] = la[rt];
  la[rt << 1 | 1] = la[rt];
  la[rt] = -1;
}
void build(int l, int r, int rt) {
  la[rt] = -1;
  if (l == r) {
    sum[rt] = (1ll << a[val[l]]);
    return;
  }
  int mid = (l + r) / 2;
  build(l, mid, rt << 1);
  build(mid + 1, r, rt << 1 | 1);
  pushup(rt);
}
void update(int L, int R, int val, int l, int r, int rt) {
  if (L <= l && R >= r) {
    sum[rt] = (1ll << val);
    la[rt] = val;
    return;
  }
  pushdown(l, r, rt);
  int mid = (l + r) / 2;
  if (L <= mid) update(L, R, val, l, mid, rt << 1);
  if (R > mid) update(L, R, val, mid + 1, r, rt << 1 | 1);
  pushup(rt);
}
long long query(int L, int R, int l, int r, int rt) {
  long long s = 0;
  if (L <= l && R >= r) {
    return sum[rt];
  }
  pushdown(l, r, rt);
  int mid = (l + r) / 2;
  if (L <= mid) s = s | query(L, R, l, mid, rt << 1);
  if (R > mid) s = s | query(L, R, mid + 1, r, rt << 1 | 1);
  return s;
}
int main() {
  memset(head, -1, sizeof(head));
  scanf("%d%d", &n, &q);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
  }
  for (int i = 1, u, v; i < n; i++) {
    scanf("%d%d", &u, &v);
    add(u, v);
    add(v, u);
  }
  dfs(1, -1);
  build(1, n, 1);
  while (q--) {
    int op, x, y;
    scanf("%d", &op);
    if (op == 1) {
      scanf("%d%d", &x, &y);
      update(le[x], ri[x], y, 1, n, 1);
    }
    if (op == 2) {
      scanf("%d", &x);
      int cnt = 0;
      long long ans = query(le[x], ri[x], 1, n, 1);
      for (int i = 0; i < 61; i++) {
        if ((ans >> i) & 1) cnt++;
      }
      printf("%d\n", cnt);
    }
  }
}
