#include <bits/stdc++.h>
using namespace std;
const int N = 50010, Log = 19, M = N * Log;
int n, m, q, C, tot, h[N], e[N << 1], nxt[N << 1], dep[N], co[N], fa[N], R, V,
    sz[N], ss, Id[N][Log], dist[N][Log], tt, dd[N], cnt[N], f[N], D[N], vis[N];
map<int, int> sum[M], dist_sum[M];
long long e1[N], e2[N], sd[N];
bool bz[N];
double ans;
void Add(int x, int y) {
  e[++tot] = y;
  nxt[tot] = h[x];
  h[x] = tot;
}
void Init(int x, int y) {
  dep[x] = dep[y] + 1;
  for (int i = h[x]; i; i = nxt[i])
    if (e[i] != y) Init(e[i], x);
}
void getrt(int x, int y) {
  sz[x] = 1;
  int mx = 0;
  for (int i = h[x]; i; i = nxt[i])
    if (!bz[e[i]] && e[i] != y) {
      getrt(e[i], x);
      sz[x] += sz[e[i]];
      mx = max(mx, sz[e[i]]);
    }
  mx = max(mx, ss - sz[x]);
  if (mx < V) V = mx, R = x;
}
void getsz(int x, int y) {
  sz[x] = 1;
  for (int i = h[x]; i; i = nxt[i])
    if (!bz[e[i]] && e[i] != y) {
      getsz(e[i], x);
    }
}
void dfs(int x, int y) {
  V = ss;
  getrt(x, 0);
  int r = R;
  bz[r] = 1;
  fa[r] = y;
  dd[r] = dd[y] + 1;
  D[tot = 1] = r;
  Id[r][dd[r]] = ++tt;
  for (int t = h[r]; t; t = nxt[t])
    if (!bz[e[t]]) {
      D[tot = 1] = e[t];
      tt++;
      vis[e[t]] = tt;
      dist[e[t]][dd[r]] = 1;
      for (int i = 1, j, x; i <= tot; i++) {
        x = D[i];
        Id[x][dd[r]] = tt;
        for (j = h[x]; j; j = nxt[j])
          if (!bz[e[j]] && vis[e[j]] < tt) {
            vis[e[j]] = tt;
            D[++tot] = e[j];
            dist[e[j]][dd[r]] = dist[x][dd[r]] + 1;
          }
      }
      ss = tot;
      dfs(e[t], r);
    }
}
int main() {
  scanf("%d%d%d%d", &n, &m, &q, &C);
  for (int i = 1; i <= n; i++) scanf("%d", &f[i]);
  for (int i = 2, x; i <= n; i++) {
    scanf("%d", &x);
    Add(x, i);
    Add(i, x);
  }
  for (int i = 1; i <= m; i++) scanf("%d", &co[i]);
  Init(1, 0);
  tot = 0;
  ss = n;
  dfs(1, 0);
  for (int i = 1; i <= n; i++) {
    cnt[f[i]]++;
    e1[f[i]] += dep[i];
    e2[f[i]] += 1ll * cnt[f[i]] * dep[i] + sd[f[i]];
    sd[f[i]] += dep[i];
    for (int j = i, k; j; j = fa[j]) {
      k = Id[j][dd[j]];
      e2[f[i]] -= dist_sum[k][f[i]] + 1ll * dist[i][dd[j]] * sum[k][f[i]];
      sum[k][f[i]]++;
      dist_sum[k][f[i]] += dist[i][dd[j]];
      if (j != i) {
        k = Id[i][dd[j]];
        e2[f[i]] += dist_sum[k][f[i]] + 1ll * dist[i][dd[j]] * sum[k][f[i]];
        sum[k][f[i]]++;
        dist_sum[k][f[i]] += dist[i][dd[j]];
      }
    }
  }
  for (int typ, x; q--;) {
    scanf("%d%d", &typ, &x);
    if (typ == 1) {
      for (int j = x, k; j; j = fa[j]) {
        k = Id[j][dd[j]];
        e2[f[x]] += dist_sum[k][f[x]] + 1ll * dist[x][dd[j]] * sum[k][f[x]];
        sum[k][f[x]]--;
        dist_sum[k][f[x]] -= dist[x][dd[j]];
        if (j != x) {
          k = Id[x][dd[j]];
          e2[f[x]] -= dist_sum[k][f[x]] + 1ll * dist[x][dd[j]] * sum[k][f[x]];
          sum[k][f[x]]--;
          dist_sum[k][f[x]] -= dist[x][dd[j]];
        }
      }
      sd[f[x]] -= dep[x];
      e1[f[x]] -= dep[x];
      e2[f[x]] -= 1ll * cnt[f[x]] * dep[x] + sd[f[x]];
      cnt[f[x]]--;
      scanf("%d", &f[x]);
      for (int j = x, k; j; j = fa[j]) {
        k = Id[j][dd[j]];
        e2[f[x]] -= dist_sum[k][f[x]] + 1ll * dist[x][dd[j]] * sum[k][f[x]];
        sum[k][f[x]]++;
        dist_sum[k][f[x]] += dist[x][dd[j]];
        if (j != x) {
          k = Id[x][dd[j]];
          e2[f[x]] += dist_sum[k][f[x]] + 1ll * dist[x][dd[j]] * sum[k][f[x]];
          sum[k][f[x]]++;
          dist_sum[k][f[x]] += dist[x][dd[j]];
        }
      }
      cnt[f[x]]++;
      e1[f[x]] += dep[x];
      e2[f[x]] += 1ll * cnt[f[x]] * dep[x] + sd[f[x]];
      sd[f[x]] += dep[x];
    } else {
      ans = 1. * C * C +
            (1. * e2[x] * co[x] * co[x] - 2. * C * e1[x] * co[x]) / n;
      printf("%.8lf\n", ans);
    }
  }
  return 0;
}
