#include <bits/stdc++.h>
using namespace std;
const int MAXn = 4 * 100 * 1000 + 17;
int n, m;
int cl[MAXn];
vector<int> adj[MAXn];
long long seg[4 * MAXn][2];
bool mark[MAXn];
int tedad = 0;
pair<int, int> se[MAXn];
void DFS(int u) {
  se[u].first = tedad;
  mark[u] = 1;
  tedad++;
  for (long long i = 0; i < (adj[u].size()); i++) {
    if (!mark[adj[u][i]]) {
      DFS(adj[u][i]);
    }
  }
  se[u].second = tedad;
}
void change(int p, int s, int e, int c, int l, int r) {
  if (r <= s || l >= e) return;
  if (l <= s && r >= e) {
    seg[p][0] = 1LL << c;
    seg[p][1] = 1;
    return;
  }
  if (seg[p][1]) {
    seg[p * 2][0] = seg[p][0];
    seg[p * 2][1] = 1;
    seg[p * 2 + 1][0] = seg[p][0];
    seg[p * 2 + 1][1] = 1;
    seg[p][1] = 0;
  }
  change(p * 2, s, (s + e) / 2, c, l, r);
  change(p * 2 + 1, (s + e) / 2, e, c, l, r);
  seg[p][0] = seg[p * 2][0] | seg[p * 2 + 1][0];
}
long long count(int p, int s, int e, int l, int r) {
  if (r <= s || l >= e) return 0;
  if (l <= s && r >= e) {
    return seg[p][0];
  }
  if (seg[p][1]) {
    seg[p * 2][0] = seg[p][0];
    seg[p * 2][1] = 1;
    seg[p * 2 + 1][0] = seg[p][0];
    seg[p * 2 + 1][1] = 1;
    seg[p][1] = 0;
  }
  return count(p * 2, s, (s + e) / 2, l, r) |
         count(p * 2 + 1, (s + e) / 2, e, l, r);
}
void MAKE(int u) {
  mark[u] = 1;
  change(1, 0, n, cl[u], se[u].first, se[u].second);
  for (long long i = 0; i < (adj[u].size()); i++) {
    if (!mark[adj[u][i]]) MAKE(adj[u][i]);
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> m;
  for (long long i = 0; i < (n); i++) {
    cin >> cl[i + 1];
  }
  for (long long i = 0; i < (n - 1); i++) {
    int u, v;
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  DFS(1);
  memset(mark, 0, sizeof(mark));
  MAKE(1);
  for (long long i = 0; i < (m); i++) {
    int t;
    cin >> t;
    if (t == 1) {
      int u, c;
      cin >> u >> c;
      change(1, 0, n, c, se[u].first, se[u].second);
    } else {
      int u;
      cin >> u;
      long long color = count(1, 0, n, se[u].first, se[u].second);
      cout << __builtin_popcount(color) + __builtin_popcount(color >> 32)
           << endl;
    }
  }
}
