#include <bits/stdc++.h>
using namespace std;
int n, Q;
int arr[400002 * 2];
struct ura {
  int ini;
  int fin;
};
ura indx[400002];
int newNodo;
struct segment_tree {
  long long int tree[400002 * 10];
  long long int lazy[400002 * 10];
  void construye(int nodo, int ini, int fin) {
    if (ini == fin) {
      if (arr[ini]) tree[nodo] = 1ll << (arr[ini] * 1ll - 1ll);
    } else {
      int med = (ini + fin) / 2;
      construye((nodo * 2), ini, med);
      construye((nodo * 2 + 1), med + 1, fin);
      tree[nodo] = tree[(nodo * 2)] | tree[(nodo * 2 + 1)];
    }
  }
  void propagate(int nodo, int ini, int fin) {
    if (lazy[nodo]) {
      if (ini != fin) lazy[(nodo * 2)] = lazy[(nodo * 2 + 1)] = lazy[nodo];
      tree[nodo] = lazy[nodo];
      lazy[nodo] = 0;
    }
  }
  void update(int nodo, int ini, int fin, int i, int j, int v) {
    propagate(nodo, ini, fin);
    if (ini > j || fin < i) return;
    if (ini >= i && fin <= j) {
      lazy[nodo] = 1ll << (v * 1ll - 1ll);
      propagate(nodo, ini, fin);
    } else {
      int med = (ini + fin) / 2;
      update((nodo * 2), ini, med, i, j, v);
      update((nodo * 2 + 1), med + 1, fin, i, j, v);
      tree[nodo] = tree[(nodo * 2)] | tree[(nodo * 2 + 1)];
    }
  }
  long long int query(int nodo, int ini, int fin, int i, int j) {
    propagate(nodo, ini, fin);
    if (ini > j || fin < i) return 0;
    if (ini >= i && fin <= j) {
      return tree[nodo];
    } else {
      int med = (ini + fin) / 2;
      return query((nodo * 2), ini, med, i, j) |
             query((nodo * 2 + 1), med + 1, fin, i, j);
    }
  }
};
segment_tree ST;
vector<int> lista[400002];
int color[400002];
bool vis[400002];
void enumera(int nodo) {
  if (vis[nodo]) return;
  vis[nodo] = true;
  indx[nodo].ini = ++newNodo;
  for (int i = 0; i < lista[nodo].size(); i++) enumera(lista[nodo][i]);
  indx[nodo].fin = ++newNodo;
}
int count_bits(long long int x) {
  int c = 0;
  while (x) {
    if (x & 1) c++;
    x >>= 1;
  }
  return c;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> Q;
  for (int i = 1; i <= n; i++) cin >> color[i];
  int a, b;
  for (int i = 1; i < n; i++) {
    cin >> a >> b;
    lista[a].push_back(b);
    lista[b].push_back(a);
  }
  enumera(1);
  for (int i = 1; i <= n; i++) arr[indx[i].ini] = color[i];
  ST.construye(1, 1, newNodo);
  int aux;
  for (int i = 1; i <= Q; i++) {
    cin >> aux;
    if (aux == 1) {
      cin >> a >> b;
      ST.update(1, 1, newNodo, indx[a].ini, indx[a].fin, b);
    } else {
      cin >> a;
      cout << count_bits(ST.query(1, 1, newNodo, indx[a].ini, indx[a].fin))
           << "\n";
    }
  }
  return 0;
}
