#include <bits/stdc++.h>
using namespace std;
int n, m;
int color[400100];
int w[400100];
struct segment_tree {
  long long a[1600100];
  bool put[1600100];
  void push(int x) {
    if (put[x]) {
      a[x * 2] = a[x * 2 + 1] = a[x];
      put[x] = false;
      put[x * 2] = put[x * 2 + 1] = true;
    }
  }
  void calc(int x) { a[x] = a[x * 2] | a[x * 2 + 1]; }
  void build(int x, int l, int r) {
    if (l < r) {
      int y = (l + r) >> 1;
      build(x * 2, l, y);
      build(x * 2 + 1, y + 1, r);
      a[x] = a[x * 2] | a[x * 2 + 1];
      put[x] = false;
    } else {
      a[x] = (1LL << color[w[l]]);
      put[x] = true;
    }
  }
  void modify(int x, int l, int r, int ll, int rr, long long v) {
    if (r < ll || l > rr) return;
    if (ll <= l && rr >= r) {
      a[x] = v;
      put[x] = true;
      return;
    }
    push(x);
    int y = (l + r) >> 1;
    modify(x * 2, l, y, ll, rr, v);
    modify(x * 2 + 1, y + 1, r, ll, rr, v);
    calc(x);
  }
  long long get(int x, int l, int r, int ll, int rr) {
    if (r < ll || l > rr) return 0LL;
    if (ll <= l && rr >= r) {
      return a[x];
    }
    push(x);
    int y = (l + r) >> 1;
    long long ret = get(x * 2, l, y, ll, rr);
    ret |= get(x * 2 + 1, y + 1, r, ll, rr);
    calc(x);
    return ret;
  }
} seg;
vector<int> ga[400100];
int u, v;
int din[400100], dout[400100];
int timer;
void dfs(int u, int p) {
  timer++;
  din[u] = timer;
  w[timer] = u;
  for (int i = 0; i < ga[u].size(); i++) {
    int v = ga[u][i];
    if (v != p) dfs(v, u);
  }
  dout[u] = timer;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n >> m;
  for (int i = 1; i <= n; i++) cin >> color[i];
  for (int i = 1; i < n; i++) {
    cin >> u >> v;
    ga[u].push_back(v);
    ga[v].push_back(u);
  }
  dfs(1, -1);
  seg.build(1, 1, n);
  int tp, aa, bb;
  for (int i = 1; i <= m; i++) {
    cin >> tp;
    if (tp == 1) {
      cin >> aa >> bb;
      seg.modify(1, 1, n, din[aa], dout[aa], (1LL << bb));
    } else {
      cin >> aa;
      cout << __builtin_popcountll(seg.get(1, 1, n, din[aa], dout[aa])) << endl;
    }
  }
  return 0;
}
