#include <bits/stdc++.h>
using namespace std;
const int maxN = 4e5 + 7;
int N, M, head[maxN], cnt, col[maxN];
struct Eddge {
  int nex, to;
  Eddge(int a = -1, int b = 0) : nex(a), to(b) {}
} edge[maxN << 1];
inline void addEddge(int u, int v) {
  edge[cnt] = Eddge(head[u], v);
  head[u] = cnt++;
}
inline void _add(int u, int v) {
  addEddge(u, v);
  addEddge(v, u);
}
inline void init() {
  cnt = 0;
  for (int i = 1; i <= N; i++) head[i] = -1;
}
int dfn[maxN], end_tim[maxN], tot = 0, rid[maxN];
void dfs(int u, int fa) {
  dfn[u] = ++tot;
  rid[tot] = u;
  for (int i = head[u], v; ~i; i = edge[i].nex) {
    v = edge[i].to;
    if (v == fa) continue;
    dfs(v, u);
  }
  end_tim[u] = tot;
}
unsigned long long t[maxN << 2], lazy[maxN << 2];
void pushup(int rt) { t[rt] = t[rt << 1] | t[rt << 1 | 1]; }
void pushdown(int rt) {
  if (lazy[rt]) {
    t[rt << 1] = lazy[rt];
    t[rt << 1 | 1] = lazy[rt];
    lazy[rt << 1] = lazy[rt];
    lazy[rt << 1 | 1] = lazy[rt];
    lazy[rt] = 0;
  }
}
void build(int rt, int l, int r) {
  lazy[rt] = 0;
  if (l == r) {
    t[rt] = (unsigned long long)1 << (col[rid[l]] - 1);
    return;
  }
  int mid = (l + r) >> 1;
  build(rt << 1, l, mid);
  build(rt << 1 | 1, mid + 1, r);
  pushup(rt);
}
unsigned long long query(int rt, int l, int r, int ql, int qr) {
  if (ql <= l && qr >= r) return t[rt];
  int mid = (l + r) >> 1;
  pushdown(rt);
  if (qr <= mid)
    return query(rt << 1, l, mid, ql, qr);
  else if (ql > mid)
    return query(rt << 1 | 1, mid + 1, r, ql, qr);
  else
    return query(rt << 1, l, mid, ql, qr) |
           query(rt << 1 | 1, mid + 1, r, ql, qr);
}
void update(int rt, int l, int r, int ql, int qr, int val) {
  if (ql <= l && qr >= r) {
    t[rt] = (unsigned long long)1 << val;
    lazy[rt] = t[rt];
    return;
  }
  int mid = (l + r) >> 1;
  pushdown(rt);
  if (qr <= mid)
    update(rt << 1, l, mid, ql, qr, val);
  else if (ql > mid)
    update(rt << 1 | 1, mid + 1, r, ql, qr, val);
  else {
    update(rt << 1, l, mid, ql, qr, val);
    update(rt << 1 | 1, mid + 1, r, ql, qr, val);
  }
  pushup(rt);
}
int count(unsigned long long x) {
  int sum = 0;
  while (x) {
    sum += x & 1;
    x >>= 1;
  }
  return sum;
}
int main() {
  scanf("%d%d", &N, &M);
  init();
  for (int i = 1; i <= N; i++) scanf("%d", &col[i]);
  for (int i = 1, u, v; i < N; i++) {
    scanf("%d%d", &u, &v);
    _add(u, v);
  }
  dfs(1, 0);
  build(1, 1, N);
  for (int i = 1, op, x, y; i <= M; i++) {
    scanf("%d", &op);
    if (op == 2) {
      scanf("%d", &x);
      printf("%u\n", count(query(1, 1, N, dfn[x], end_tim[x])));
    } else {
      scanf("%d%d", &x, &y);
      update(1, 1, N, dfn[x], end_tim[x], y - 1);
    }
  }
  return 0;
}
