#include <bits/stdc++.h>
using namespace std;
const int MAXN = 4e5 + 100, MAXV = 66;
int ar[MAXN], nn[MAXN], lb[MAXN], rb[MAXN], up[MAXN * 4];
vector<int> v[MAXN];
bool t[MAXN * 4][MAXV];
int c = 0;
void dfs(int node, int p) {
  nn[c] = ar[node];
  lb[node] = rb[node] = c++;
  for (int to : v[node]) {
    if (to != p) {
      dfs(to, node);
      lb[node] = min(lb[node], lb[to]);
      rb[node] = max(rb[node], rb[to]);
    }
  }
}
void build(int v, int L, int R) {
  if (L == R) {
    t[v][nn[L]] = 1;
  } else {
    int m = (L + R) >> 1;
    build(v * 2, L, m);
    build(v * 2 + 1, m + 1, R);
    for (int i = 0; i < MAXV; i++) {
      t[v][i] = max(t[v * 2 + 1][i], t[v * 2][i]);
    }
  }
}
void push(int v, bool leaf) {
  if (up[v] != -1) {
    if (!leaf) {
      up[v * 2] = up[v * 2 + 1] = up[v];
    }
    memset(t[v], 0, sizeof(t[v]));
    ;
    t[v][up[v]] = 1;
    up[v] = -1;
  }
}
void update(int l, int r, int x, int v, int L, int R) {
  if (l > R || r < L) return;
  if (l == L && r == R) {
    up[v] = x;
    push(v, l == r);
  } else {
    int m = (L + R) >> 1;
    push(v, false);
    push(v * 2, L == m);
    push(v * 2 + 1, m + 1 == R);
    update(l, min(r, m), x, v * 2, L, m);
    update(max(m + 1, l), r, x, v * 2 + 1, m + 1, R);
    for (int i = 0; i < MAXV; i++) {
      t[v][i] = max(t[v * 2 + 1][i], t[v * 2][i]);
    }
  }
}
void query(vector<int> &d, int l, int r, int v, int L, int R) {
  if (l > R || r < L) return;
  if (l == L && r == R) {
    for (int i = 0; i < MAXV; i++) {
      d[i] = max(d[i], (int)t[v][i]);
    }
  } else {
    int m = (L + R) >> 1;
    push(v, false);
    push(v * 2, L == m);
    push(v * 2 + 1, m + 1 == R);
    set<int> a;
    query(d, l, min(m, r), v * 2, L, m);
    query(d, max(m + 1, l), r, v * 2 + 1, m + 1, R);
  }
}
int main() {
#pragma warning(disable : 4996)
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) {
    scanf("%d", &ar[i]);
  }
  for (int i = 0; i < n - 1; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    x--;
    y--;
    v[x].push_back(y);
    v[y].push_back(x);
  }
  dfs(0, 0);
  memset(up, 255, sizeof(up));
  ;
  build(1, 0, n - 1);
  for (int i = 0; i < m; i++) {
    int tp, v, c;
    scanf("%d%d", &tp, &v);
    v--;
    if (tp == 1) {
      scanf("%d", &c);
      update(lb[v], rb[v], c, 1, 0, n - 1);
    } else {
      vector<int> d(MAXV, 0);
      query(d, lb[v], rb[v], 1, 0, n - 1);
      int ans = 0;
      for (int a : d) ans += a;
      printf("%d\n", ans);
    }
  }
  return 0;
}
