#include <bits/stdc++.h>
using namespace std;
struct edge {
  int u, v, nxt;
} edges[800016];
int cnt;
int now;
int n, m;
int head[400008];
int in[400008];
int out[400008];
int clr[400008];
long long val[6000010];
long long mrk[6000010];
void add_edge(int u, int v) {
  edges[cnt].u = u;
  edges[cnt].v = v;
  edges[cnt].nxt = head[u];
  head[u] = cnt++;
}
void dfs(int u, int fa) {
  in[u] = ++now;
  for (int i = head[u]; i != -1; i = edges[i].nxt) {
    int v = edges[i].v;
    if (fa == v) continue;
    dfs(v, u);
  }
  out[u] = now;
}
void push_down(int pos) {
  if (mrk[pos]) {
    mrk[pos << 1] = mrk[pos << 1 | 1] = mrk[pos];
    val[pos] = mrk[pos];
    mrk[pos] = 0;
  }
}
void update(int pos) {
  push_down(pos);
  push_down(pos << 1);
  push_down(pos << 1 | 1);
  val[pos] = val[pos << 1] | val[pos << 1 | 1];
}
void modify(int l, int r, int tl, int tr, int pos, long long cr) {
  push_down(pos);
  if (tl <= l && tr >= r) {
    mrk[pos] = cr;
    return;
  }
  int mid = (l + r) >> 1;
  if (tl <= mid) modify(l, mid, tl, tr, pos << 1, cr);
  if (tr > mid) modify(mid + 1, r, tl, tr, pos << 1 | 1, cr);
  update(pos);
}
long long query(int l, int r, int tl, int tr, int pos) {
  update(pos);
  if (tl <= l && r <= tr) {
    return val[pos];
  }
  long long ret = 0;
  int mid = (l + r) >> 1;
  if (tl <= mid) ret |= query(l, mid, tl, tr, pos << 1);
  if (tr > mid) ret |= query(mid + 1, r, tl, tr, pos << 1 | 1);
  return ret;
}
int find_clr(int pos) {
  long long tt = query(1, n, in[pos], out[pos], 1);
  int ans = 0;
  for (int i = 0; i <= 59; i++) {
    if (tt >> i & 1) ans++;
  }
  return ans;
}
void build(int u, int fa) {
  modify(1, n, in[u], out[u], 1, 1ll << (clr[u] - 1));
  for (int i = head[u]; i != -1; i = edges[i].nxt) {
    int v = edges[i].v;
    if (fa == v) continue;
    build(v, u);
  }
}
int main() {
  cnt = 0;
  now = 0;
  memset(head, -1, sizeof(head));
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &clr[i]);
  }
  int u, v;
  for (int i = 1; i < n; i++) {
    scanf("%d %d", &u, &v);
    add_edge(u, v);
    add_edge(v, u);
  }
  dfs(1, -1);
  build(1, -1);
  for (int i = 1; i <= m; i++) {
    int a, b, c;
    scanf("%d", &a);
    if (a == 1) {
      scanf("%d %d", &b, &c);
      modify(1, n, in[b], out[b], 1, 1ll << (c - 1));
    } else {
      scanf("%d", &b);
      int ans = find_clr(b);
      printf("%d\n", ans);
    }
  }
  return 0;
}
