#include <bits/stdc++.h>
using namespace std;
const long long LINF = (long long)1e18;
const int INF = (int)1e9 + 7;
const int N = (int)5e5 + 228;
const double EPS = (double)1e-9;
const double PI = (double)3.14159265359;
const int MODULO[6] = {INF,        1000019677, 1000019393,
                       1000007521, 1000024073, 1000009667};
const int PF[5] = {77, 31, 98, 45, 67};
const int nx[4] = {0, 0, 1, -1};
const int ny[4] = {1, -1, 0, 0};
inline bool eq(const long double &a, const long double &b) {
  return fabs(a - b) < EPS;
}
int tin[N], tout[N];
int tmr;
struct tr {
  long long c;
  int eq;
};
tr t[N * 6];
int n, m;
vector<int> g[N];
void dfs(int x, int p) {
  tin[x] = ++tmr;
  for (auto it : g[x])
    if (it != p) dfs(it, x);
  tout[x] = ++tmr;
}
void push(int v, int l, int r) {
  if (t[v].eq) {
    t[v].c = (1LL << t[v].eq);
    if (l < r) {
      t[v + v].eq = t[v].eq;
      t[v + v + 1].eq = t[v].eq;
      t[v].eq = 0;
    }
  }
}
void update(int v, int l, int r, int L, int R, int val) {
  push(v, l, r);
  if (L > r || R < l) return;
  if (L <= l && r <= R) {
    t[v].eq = val;
    push(v, l, r);
    return;
  }
  int mid = (l + r) / 2;
  update(v + v, l, mid, L, R, val);
  update(v + v + 1, mid + 1, r, L, R, val);
  t[v].c = t[v + v].c | t[v + v + 1].c;
}
long long get(int v, int l, int r, int L, int R) {
  push(v, l, r);
  if (L > r || R < l) return 0;
  if (L <= l && r <= R) return t[v].c;
  int mid = (l + r) / 2;
  return get(v + v, l, mid, L, R) | get(v + v + 1, mid + 1, r, L, R);
}
int clr[N];
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &clr[i]);
  }
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    g[x].push_back(y);
    g[y].push_back(x);
  }
  dfs(1, -1);
  for (int i = 1; i <= n; i++) {
    update(1, 1, tout[1], tin[i], tin[i], clr[i]);
  }
  while (m--) {
    int type, vk, ck, res = 0;
    scanf("%d", &type);
    if (type == 1) {
      scanf("%d%d", &vk, &ck);
      update(1, 1, tout[1], tin[vk], tout[vk], ck);
    } else {
      scanf("%d", &vk);
      printf("%d\n",
             __builtin_popcountll(get(1, 1, tout[1], tin[vk], tout[vk])));
    }
  }
  return 0;
}
