#include <bits/stdc++.h>
using namespace std;
const int N6 = 3e6 + 6, N3 = 1e3 + 6, oo = 1e9 + 9;
const long long ool = 1e18 + 9;
int n, m;
long long col[N6], a[N6], tin[N6], tout[N6], timer;
vector<int> g[N6];
struct SegTree {
  long long t[N6], ch[N6];
  void recalc(int v) { t[v] = (t[v << 1] | t[v << 1 | 1]); }
  void build(int v, int tl, int tr) {
    if (tl == tr - 1) {
      t[v] = (1ll << (col[a[tl]] - 1));
      return;
    }
    int mid = (tl + tr) / 2;
    build(v << 1, tl, mid);
    build(v << 1 | 1, mid, tr);
    recalc(v);
  }
  void push(int v, int tl, int tr) {
    if (!ch[v]) return;
    t[v] = (1LL << (ch[v] - 1));
    if (tl != tr - 1) {
      ch[v << 1] = ch[v];
      ch[v << 1 | 1] = ch[v];
    }
    ch[v] = 0;
  }
  void upd(int v, int tl, int tr, int ql, int qr, int c) {
    push(v, tl, tr);
    if (qr <= tl || tr <= ql) return;
    if (ql <= tl && tr <= qr) {
      ch[v] = c;
      push(v, tl, tr);
      return;
    }
    int mid = (tl + tr) / 2;
    upd(v << 1, tl, mid, ql, qr, c);
    upd(v << 1 | 1, mid, tr, ql, qr, c);
    recalc(v);
  }
  long long get(int v, int tl, int tr, long long ql, long long qr) {
    push(v, tl, tr);
    if (tr <= ql || qr <= tl) return 0;
    if (ql <= tl && tr <= qr) return t[v];
    int mid = (tl + tr) / 2;
    return (get(v << 1, tl, mid, ql, qr) | get(v << 1 | 1, mid, tr, ql, qr));
  }
} t;
void dfs(int v, int par) {
  tin[v] = ++timer;
  a[timer] = v;
  for (auto to : g[v])
    if (to != par) dfs(to, v);
  tout[v] = timer;
}
int main() {
  ios_base ::sync_with_stdio(0);
  cin >> n >> m;
  for (int i = 1; i <= n; ++i) {
    cin >> col[i];
  }
  for (int i = 1; i <= n - 1; ++i) {
    int x, y;
    cin >> x >> y;
    g[x].push_back(y);
    g[y].push_back(x);
  }
  dfs(1, -1);
  t.build(1, 1, timer + 1);
  for (int i = 1; i <= m; ++i) {
    int qt, v;
    cin >> qt >> v;
    if (qt == 1) {
      int c;
      cin >> c;
      t.upd(1, 1, timer + 1, tin[v], tout[v] + 1, c);
    } else {
      long long ans = t.get(1, 1, timer + 1, tin[v], tout[v] + 1LL);
      cout << __builtin_popcountll(ans) << "\n";
    }
  }
  return 0;
}
