#include <bits/stdc++.h>
using namespace std;
long long st[4 * 400100 + 10];
long long lazy[4 * 400100 + 10];
int n, m;
long long color[400100];
vector<int> v[400100];
map<int, int> g;
int dist[400100];
bool visit[400100];
int y;
int dfs(int u, int prev) {
  int x = 0;
  visit[u] = true;
  g[u] = y;
  y++;
  for (int i = 0; i < v[u].size(); i++) {
    int adj = v[u][i];
    if (adj != prev && !visit[adj]) {
      x += dfs(adj, u);
    }
  }
  dist[g[u]] = x;
  return x + 1;
}
void update(int p, int a, int b, int i, int j, long long val) {
  if (lazy[p] != 0) {
    st[p] = lazy[p];
    if (a != b) {
      lazy[2 * p] = lazy[p];
      lazy[2 * p + 1] = lazy[p];
    }
    lazy[p] = 0;
  }
  if (a > j || b < i || i > j || a > b) return;
  if (a >= i && b <= j) {
    st[p] = val;
    if (a != b) {
      lazy[2 * p] = val;
      lazy[2 * p + 1] = val;
    }
    return;
  }
  int mid = (a + b) / 2;
  update(2 * p, a, mid, i, j, val);
  update(2 * p + 1, mid + 1, b, i, j, val);
  st[p] = (st[2 * p] | st[2 * p + 1]);
}
long long query(int p, int a, int b, int i, int j) {
  if (lazy[p] != 0) {
    st[p] = lazy[p];
    if (a != b) {
      lazy[2 * p] = lazy[p];
      lazy[2 * p + 1] = lazy[p];
    }
    lazy[p] = 0;
  }
  if (a > j || b < i || i > j) return 0 * 1LL;
  if (a >= i && b <= j) return st[p];
  int mid = (a + b) / 2;
  long long x = query(2 * p, a, mid, i, j);
  long long y = query(2 * p + 1, mid + 1, b, i, j);
  return (x | y);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  long long aux = 1 * 1LL;
  for (int i = 0; i < n; i++) {
    long long x;
    cin >> x;
    color[i + 1] = (aux << (x - 1));
  }
  for (int i = 0; i < n - 1; i++) {
    long long x, y;
    cin >> x >> y;
    v[x].push_back(y);
    v[y].push_back(x);
  }
  y = 1;
  dfs(1, 1);
  for (int i = 0; i < n; i++) {
    update(1, 1, n, g[i + 1], g[i + 1], color[i + 1]);
  }
  for (int i = 0; i < m; i++) {
    int t;
    long long a, b;
    cin >> t;
    if (t == 1) {
      cin >> a >> b;
      update(1, 1, n, g[a], g[a] + dist[g[a]], (aux << (b - 1)));
    } else {
      cin >> a;
      long long x = query(1, 1, n, g[a], g[a] + dist[g[a]]);
      cout << __builtin_popcountll(x) << endl;
    }
  }
  return 0;
}
