#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
const int M = 1000;
int n, m, q, tick;
int a[N], b[N], st[N], nd[N];
vector<int> v[N];
void dfs(int p, int x) {
  st[x] = ++tick;
  for (auto u : v[x])
    if (u != p) dfs(x, u);
  nd[x] = tick;
}
int lazy[N << 2];
bitset<M> pr, bit[N << 2];
void doit(int x, int k) {
  k %= m;
  lazy[x] = (lazy[x] + k) % m;
  bit[x] = (bit[x] << k) | (bit[x] >> m - k);
}
void push(int x) {
  doit(x + x, lazy[x]);
  doit(x + x + 1, lazy[x]);
  lazy[x] = 0;
}
void init(int x, int l, int r) {
  if (l == r)
    bit[x][a[l]] = 1;
  else {
    int m = (l + r) >> 1;
    init(x + x, l, m);
    init(x + x + 1, m + 1, r);
    bit[x] = bit[x + x] | bit[x + x + 1];
  }
}
void update(int x, int l, int r, int x1, int x2, int k) {
  if (x2 < l or r < x1) return;
  if (x1 <= l and r <= x2) {
    doit(x, k);
    return;
  }
  int m = (l + r) >> 1;
  push(x);
  update(x + x, l, m, x1, x2, k);
  update(x + x + 1, m + 1, r, x1, x2, k);
  bit[x] = bit[x + x] | bit[x + x + 1];
}
bitset<M> query(int x, int l, int r, int x1, int x2) {
  if (x2 < l or r < x1) return bitset<M>();
  if (x1 <= l and r <= x2) return bit[x];
  int m = (l + r) >> 1;
  push(x);
  return query(x + x, l, m, x1, x2) | query(x + x + 1, m + 1, r, x1, x2);
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 2; i < m; i++) {
    bool flag = 0;
    for (int j = 2; j < i and j * j <= i; j++) {
      if (i % j == 0) {
        flag = 1;
        break;
      }
    }
    if (!flag) pr[i] = 1;
  }
  for (int i = 1; i <= n; i++) {
    scanf("%d", b + i);
  }
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    v[x].push_back(y);
    v[y].push_back(x);
  }
  dfs(0, 1);
  for (int i = 1; i <= n; i++) a[st[i]] = b[i] % m;
  init(1, 1, n);
  scanf("%d", &q);
  for (int i = 1; i <= q; i++) {
    int c;
    scanf("%d", &c);
    if (c == 1) {
      int x, k;
      scanf("%d %d", &x, &k);
      update(1, 1, n, st[x], nd[x], k);
    } else {
      int x;
      scanf("%d", &x);
      printf("%d\n", (query(1, 1, n, st[x], nd[x]) & pr).count());
    }
  }
  return 0;
}
