#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9 + 10;
const int maxn = 4e5 + 10;
long long msk[maxn * 4];
vector<int> g[maxn];
bool cg[maxn * 4];
int n, m, sz[maxn], per[maxn], pos[maxn], c[maxn], n2 = 0;
void build(int x, int l, int r) {
  if (l == r) {
    cg[x] = 1;
    msk[x] = 1ll << c[per[l]];
  } else {
    build(x << 1, l, (l + r) >> 1);
    build(x << 1 | 1, ((l + r) >> 1) + 1, r);
    cg[x] = 0;
    msk[x] = msk[x << 1] | msk[x << 1 | 1];
  }
}
void push(int x) {
  if (cg[x]) {
    cg[x] = 0;
    cg[x << 1 | 1] = cg[x << 1] = 1;
    msk[x << 1 | 1] = msk[x << 1] = msk[x];
  }
}
void update(int x, int l, int r, int cl, int cr, long long chg) {
  if (r < cl || l > cr) return;
  if (cl <= l && r <= cr) {
    msk[x] = chg;
    cg[x] = 1;
    return;
  }
  push(x);
  update(x << 1, l, (l + r) >> 1, cl, cr, chg);
  update(x << 1 | 1, ((l + r) >> 1) + 1, r, cl, cr, chg);
  msk[x] = msk[x << 1] | msk[x << 1 | 1];
}
long long getval(int x, int l, int r, int cl, int cr) {
  if (r < cl || l > cr) return 0ll;
  if (cl <= l && r <= cr) return msk[x];
  push(x);
  long long ret = 0ll;
  ret |= getval(x << 1, l, (l + r) >> 1, cl, cr);
  ret |= getval(x << 1 | 1, ((l + r) >> 1) + 1, r, cl, cr);
  msk[x] |= msk[x << 1] | msk[x << 1 | 1];
  return ret;
}
int dfs(int x, int fa) {
  pos[x] = n2;
  per[n2++] = x;
  sz[x] = 1;
  for (int i = 0; i < g[x].size(); i++) {
    int to = g[x][i];
    if (to != fa) sz[x] += dfs(to, x);
  }
  return sz[x];
}
int cct(long long mask) {
  int ret = 0;
  for (int i = 0; i < 60; i++) {
    long long now = 1ll << i;
    if (mask & now) ret++;
  }
  return ret;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) scanf("%d", c + i);
  for (int i = 0; i < n; i++) c[i]--;
  for (int i = 0; i < n - 1; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    u--;
    v--;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  dfs(0, -1);
  for (int i = 0; i < maxn * 4; i++) cg[maxn] = false;
  for (int i = 0; i < maxn * 4; i++) msk[i] = 0ll;
  build(1, 0, n - 1);
  for (int test = 0; test < m; test++) {
    int f;
    scanf("%d", &f);
    if (f == 1) {
      int x, col;
      scanf("%d%d", &x, &col);
      x--;
      col--;
      update(1, 0, n - 1, pos[x], pos[x] + sz[x] - 1, 1ll << col);
    } else {
      int x;
      scanf("%d", &x);
      x--;
      long long mask = getval(1, 0, n - 1, pos[x], pos[x] + sz[x] - 1);
      printf("%d\n", cct(mask));
    }
  }
  return 0;
}
