#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O2,no-stack-protector,unroll-loops,fast-math")
const int maxn = 2e5 + 10, maxm = 1e3 + 10, lg = 12, mod = 1e9 + 7, inf = 1e18;
int n, q, m, a[maxn], st[maxn], ft[maxn], tt, laz[maxn << 2];
bitset<maxm> seg[maxn << 2], tmp, prime;
vector<int> g[maxn];
void app(int v, int x) {
  seg[v] = (seg[v] << x) | (seg[v] >> (m - x));
  (laz[v] += x) %= m;
}
void shift(int v) {
  if (!laz[v]) return;
  app((v << 1), laz[v]), app(((v << 1) ^ 1), laz[v]);
  laz[v] = 0;
}
void add(int l, int r, int x, int s = 0, int t = n, int v = 1) {
  if (l >= t || r <= s) return;
  if (l <= s && r >= t) return app(v, x);
  shift(v);
  add(l, r, x, s, ((s + t) >> 1), (v << 1));
  add(l, r, x, ((s + t) >> 1), t, ((v << 1) ^ 1));
  seg[v] = seg[(v << 1)] | seg[((v << 1) ^ 1)];
}
void get(int l, int r, int s = 0, int t = n, int v = 1) {
  if (l >= t || r <= s) return;
  if (l <= s && r >= t) {
    tmp |= seg[v];
    return;
  }
  shift(v);
  get(l, r, s, ((s + t) >> 1), (v << 1));
  get(l, r, ((s + t) >> 1), t, ((v << 1) ^ 1));
}
void pfs(int v = 1, int p = 0) {
  st[v] = tt++;
  for (auto u : g[v])
    if (u != p) pfs(u, v);
  ft[v] = tt;
  add(st[v], st[v] + 1, a[v] % m);
}
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= n; i++) cin >> a[i];
  for (int i = 1; i < n; i++) {
    int v, u;
    cin >> v >> u;
    g[v].push_back(u), g[u].push_back(v);
  }
  for (int i = 0; i < maxn * 4; i++) seg[i][0] = 1;
  pfs();
  for (int i = 2; i < m; i++) {
    bool first = 1;
    for (int j = 2; j < i; j++)
      if (i % j == 0) first = 0;
    if (first) prime[i] = 1;
  }
  cin >> q;
  while (q--) {
    int ty, v;
    cin >> ty >> v;
    if (ty == 1) {
      int x;
      cin >> x;
      x %= m;
      if (x) add(st[v], ft[v], x);
    } else {
      tmp = 0;
      get(st[v], ft[v]);
      tmp &= prime;
      cout << tmp.count() << '\n';
    }
  }
  return 0;
}
