#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:100000000")
using namespace std;
long long d[1 << 20], p[1 << 20];
int h = 1 << 19;
vector<int> m[400100];
int u[400100], l[400100], r[400100], w[400100], c;
void dfs(int i) {
  int j;
  u[i] = 1;
  l[i] = c++;
  for (j = 0; j < m[i].size(); j++)
    if (!u[m[i][j]]) dfs(m[i][j]);
  r[i] = c - 1;
}
int cnt(long long n) {
  int r = 0;
  for (; n; r++, n &= n - 1)
    ;
  return r;
}
void upd(int l, int r, long long v, int k, int i, int j) {
  if (i >= l && j <= r) {
    d[k] = 1ll << v;
    p[k] = d[k];
  } else {
    if (d[k]) {
      d[2 * k] = d[k];
      d[2 * k + 1] = d[k];
      p[2 * k] = d[k];
      p[2 * k + 1] = d[k];
      d[k] = 0;
    }
    int c = (i + j) / 2;
    if (c >= l) upd(l, r, v, 2 * k, i, c);
    if (c + 1 <= r) upd(l, r, v, 2 * k + 1, c + 1, j);
    p[k] = p[2 * k] | p[2 * k + 1];
  }
}
long long getsum(int l, int r, int k, int i, int j) {
  if (i >= l && j <= r)
    return p[k];
  else {
    if (d[k]) {
      d[2 * k] = d[k];
      d[2 * k + 1] = d[k];
      p[2 * k] = d[k];
      p[2 * k + 1] = d[k];
      d[k] = 0;
    }
    int c = (i + j) / 2;
    long long v = 0;
    if (c >= l) v |= getsum(l, r, 2 * k, i, c);
    if (c + 1 <= r) v |= getsum(l, r, 2 * k + 1, c + 1, j);
    p[k] = p[2 * k] | p[2 * k + 1];
    return v;
  }
}
int main() {
  int i, j, k, n, q;
  scanf("%d%d", &n, &q);
  for (i = 0; i < n; scanf("%d", &w[i]), w[i]--, i++)
    ;
  for (k = n - 1; k--;
       scanf("%d%d", &i, &j), i--, j--, m[i].push_back(j), m[j].push_back(i))
    ;
  dfs(0);
  for (i = 0; i < n; d[h + l[i]] = 1ll << w[i], p[h + l[i]] = d[h + l[i]], i++)
    ;
  for (i = h - 1; i > 0; p[i] = p[2 * i] | p[2 * i + 1], i--)
    ;
  for (; q--;) {
    scanf("%d", &i);
    if (i == 1) {
      scanf("%d%d", &i, &j);
      i--;
      j--;
      upd(l[i], r[i], j, 1, 0, h - 1);
    } else {
      scanf("%d", &i);
      i--;
      printf("%d\n", cnt(getsum(l[i], r[i], 1, 0, h - 1)));
    }
  }
  return 0;
}
