#include <bits/stdc++.h>
using namespace std;
const int N = 1 << 17;
int st[N], op[N], sz[N], dp[N], pid[N], c[N], hd[N], p[N], f[N], g[N], add[N];
double ans[N];
vector<int> adj[N], V[N];
long long sum[N];
int T, pn;
void dfs(int u) {
  sz[u] = 1;
  dp[u] = dp[p[u]] + 1;
  for (auto v : adj[u]) {
    dfs(v);
    sz[u] += sz[v];
  }
}
void dfs1(int u) {
  st[u] = ++T;
  pid[u] = pn;
  if (!hd[pn]) hd[pn] = u;
  int w = 0;
  for (auto v : adj[u])
    if (sz[v] > sz[w]) w = v;
  if (w) dfs1(w);
  for (auto v : adj[u]) {
    if (v != w) {
      pn++;
      dfs1(v);
    }
  }
}
long long ret2, ret1;
void renew(int u, int l, int k) {
  add[u] += k;
  sum[u] += k * l;
}
void push_down(int u, int l) {
  if (add[u]) {
    renew(u + u, (l + 1) / 2, add[u]);
    renew(u + u + 1, l / 2, add[u]);
    add[u] = 0;
  }
}
void push_up(int u) { sum[u] = sum[u + u] + sum[u + u + 1]; }
void modify(int u, int l, int r, int ll, int rr, int k) {
  if (ll <= l && r <= rr) {
    renew(u, r - l + 1, k);
    return;
  }
  int mid = l + r >> 1;
  push_down(u, r - l + 1);
  if (ll <= mid) modify(u + u, l, mid, ll, rr, k);
  if (mid < rr) modify(u + u + 1, mid + 1, r, ll, rr, k);
  push_up(u);
}
long long query(int u, int l, int r, int ll, int rr) {
  if (ll <= l && r <= rr) return sum[u];
  int mid = l + r >> 1;
  long long ret = 0;
  push_down(u, r - l + 1);
  if (ll <= mid) ret += query(u + u, l, mid, ll, rr);
  if (mid < rr) ret += query(u + u + 1, mid + 1, r, ll, rr);
  return ret;
}
int n;
void update(int u, int k) {
  ret1 += k * dp[u];
  ret2 += dp[u];
  while (u) {
    int l = hd[pid[u]];
    ret2 += 2 * k * query(1, 1, n, st[l], st[u]);
    modify(1, 1, n, st[l], st[u], k);
    u = p[l];
  }
}
int main() {
  int m, q, C;
  scanf("%d%d%d%d", &n, &m, &q, &C);
  for (int i = 1; i <= n; i++)
    scanf("%d", &f[i]), V[f[i]].push_back(i), g[i] = f[i];
  for (int i = 2; i <= n; i++) scanf("%d", &p[i]), adj[p[i]].push_back(i);
  for (int i = 1; i <= m; i++) scanf("%d", &c[i]);
  for (int i = 1; i <= q; i++) {
    scanf("%d", &op[i]);
    if (op[i] == 1) {
      int x, w;
      scanf("%d%d", &x, &w);
      V[g[x]].push_back(-x);
      g[x] = w;
      V[g[x]].push_back(x);
    } else {
      int k;
      scanf("%d", &k);
      V[k].push_back(n + i);
    }
  }
  dfs(1);
  dfs1(1);
  set<int> S;
  for (int i = 1; i <= m; i++) {
    for (auto e : S) update(e, -1);
    S.clear();
    ret2 = 0, ret1 = 0;
    for (int event : V[i]) {
      if (event < 0) {
        S.erase(-event);
        update(-event, -1);
      } else if (event <= n) {
        S.insert(event);
        update(event, 1);
      } else {
        ans[event - n] = (long double)(ret2 * c[i] * c[i] -
                                       2 * ret1 * c[i] * C + C * 1LL * C * n) /
                         n;
      }
    }
  }
  for (int i = 1; i <= q; i++)
    if (op[i] == 2) printf("%.10lf\n", ans[i]);
  return 0;
}
