#include <bits/stdc++.h>
inline void in(int &MAGNUS) { scanf("%d", &MAGNUS); }
inline void out(int MAGNUS) { printf("%d\n", MAGNUS); }
inline void in(int &MAGNUS, int &CLAR) { scanf("%d%d", &MAGNUS, &CLAR); }
inline void out(int MAGNUS, int CLAR) { printf("%d %d\n", MAGNUS, CLAR); }
inline void inl(long long &LIV) { scanf("%lld", &LIV); }
inline void inl(long long &LIV, long long &MART) {
  scanf("%lld%lld", &LIV, &MART);
}
inline void outl(long long LIV) { printf("%lld\n", LIV); }
inline void outl(long long LIV, long long MART) {
  printf("%lld %lld\n", LIV, MART);
}
using namespace std;
int N;
vector<int> graf[400005];
vector<int> path;
int cur = 1, start[400005], last[400005], col[400005], Q;
long long node[1200005], memo[1200005];
int bitcount(long long x) {
  int ret = 0;
  while (x > 0) {
    ret += (x & 1);
    x >>= 1;
  }
  return ret;
}
void dfs(int now, int par) {
  path.push_back(now);
  start[now] = path.size() - 1;
  for (int i = 0; i <= (int)graf[now].size() - 1; i++) {
    int nex = graf[now][i];
    if (nex == par) continue;
    dfs(nex, now);
  }
  last[now] = path.size() - 1;
}
void propagate(int id) {
  if (memo[id] > 0)
    node[2 * id] = node[2 * id + 1] = memo[2 * id] = memo[2 * id + 1] =
        memo[id];
  memo[id] = 0;
}
void update(int L, int R, int id, int from, int to, long long val) {
  if (from > R || to < L) return;
  if (from <= L && R <= to) {
    memo[id] = node[id] = val;
    return;
  }
  int M = (L + R) / 2;
  propagate(id);
  update(L, M, 2 * id, from, to, val);
  update(M + 1, R, 2 * id + 1, from, to, val);
  node[id] = node[2 * id] | node[2 * id + 1];
}
long long query(int L, int R, int id, int from, int to) {
  if (from > R || to < L) return 0;
  if (from <= L && R <= to) return node[id];
  int M = (L + R) / 2;
  propagate(id);
  return query(L, M, 2 * id, from, to) | query(M + 1, R, 2 * id + 1, from, to);
}
int main() {
  path.push_back(0);
  in(N, Q);
  for (int i = 1; i <= N; i++) {
    in(col[i]);
  }
  for (int i = 1; i <= N - 1; i++) {
    int a, b;
    in(a, b);
    graf[a].push_back(b);
    graf[b].push_back(a);
  }
  dfs(1, -1);
  for (int i = 1; i <= N; i++)
    update(1, N, 1, start[i], start[i], 1LL << col[i]);
  for (int q = 1; q <= Q; q++) {
    int tip;
    in(tip);
    if (tip == 1) {
      int v, c;
      in(v, c);
      update(1, N, 1, start[v], last[v], 1LL << c);
    } else {
      int v;
      in(v);
      out(bitcount(query(1, N, 1, start[v], last[v])));
    }
  }
  return 0;
}
