#include <bits/stdc++.h>
int edge[300000], next[300000], first[300000];
int c[300000], d[500][2000], e[500], g[300000], l[300000], r[300000], o[300000],
    q[300], v[500];
bool b[3000], u[2000];
int i, j, k, m, n, p, t, w, x, y, z, sum_edge, dfs_clock;
inline void addedge(int x, int y) {
  sum_edge++, edge[sum_edge] = y, next[sum_edge] = first[x],
              first[x] = sum_edge;
  return;
}
inline void dfs(int x, int y) {
  dfs_clock++;
  o[dfs_clock] = x;
  l[x] = dfs_clock;
  for (int i = first[x]; i != 0; i = next[i])
    if (edge[i] != y) dfs(edge[i], x);
  r[x] = dfs_clock;
  return;
}
inline bool checkprime(int x) {
  for (int i = 2; i * i <= x; i++)
    if (!(x % i)) return false;
  return true;
}
inline void pre() {
  scanf("%d%d", &n, &m);
  for (i = 1; i <= n; i++) scanf("%d", &g[i]), g[i] = g[i] % m;
  for (i = 1; i < n; i++) {
    scanf("%d%d", &x, &y);
    addedge(x, y), addedge(y, x);
  }
  dfs(1, 0);
  for (i = 2; i < m; i++)
    if (checkprime(i)) b[i] = true, p++, q[p] = i;
  return;
}
inline void getans() {
  w = 300;
  for (i = 1; i <= n; i++) c[i] = (i - 1) / w + 1, v[c[i]]++;
  for (i = 1; i <= n; i++) d[c[i]][g[o[i]] % m]++;
  scanf("%d", &t);
  for (i = 1; i <= t; i++) {
    scanf("%d", &x);
    if (x == 1) {
      scanf("%d%d", &y, &z);
      if (c[l[y]] == c[r[y]])
        for (j = l[y]; j <= r[y]; j++) {
          d[c[j]][g[o[j]] % m]--;
          g[o[j]] = (g[o[j]] + z) % m;
          d[c[j]][g[o[j]] % m]++;
        }
      else {
        for (j = l[y]; j <= (c[l[y]] - 1) * w + v[c[l[y]]]; j++) {
          d[c[j]][g[o[j]] % m]--;
          g[o[j]] = (g[o[j]] + z) % m;
          d[c[j]][g[o[j]] % m]++;
        }
        for (j = (c[r[y]] - 1) * w + 1; j <= r[y]; j++) {
          d[c[j]][g[o[j]] % m]--;
          g[o[j]] = (g[o[j]] + z) % m;
          d[c[j]][g[o[j]] % m]++;
        }
        for (j = c[l[y]] + 1; j <= c[r[y]] - 1; j++) e[j] = (e[j] + z) % m;
      }
    } else {
      scanf("%d", &y);
      for (j = 1; j <= p; j++) u[q[j]] = true;
      if (c[l[y]] == c[r[y]])
        for (j = l[y]; j <= r[y]; j++) u[(g[o[j]] + e[c[j]]) % m] = false;
      else {
        for (j = l[y]; j <= (c[l[y]] - 1) * w + v[c[l[y]]]; j++)
          u[(g[o[j]] + e[c[j]]) % m] = false;
        for (j = (c[r[y]] - 1) * w + 1; j <= r[y]; j++)
          u[(g[o[j]] + e[c[j]]) % m] = false;
        for (k = 1; k <= p; k++)
          if (u[q[k]])
            for (j = c[l[y]] + 1; j <= c[r[y]] - 1; j++)
              if (d[j][(q[k] - e[j] + m) % m]) {
                u[q[k]] = false;
                break;
              }
      }
      z = 0;
      for (j = 1; j <= p; j++)
        if (!u[q[j]]) z++;
      printf("%d\n", z);
    }
  }
  return;
}
int main() {
  pre();
  getans();
  return 0;
}
