#include <bits/stdc++.h>
using namespace std;
struct node {
  int l, r, f;
  double add, sum;
} t[4 * 51000];
vector<int> pp[51000];
vector<int> g[51000];
vector<int> p[51000];
double ans[51000], sum[51000], sum_2[51000], c[51000], C;
int n, m, q, k, b[51000], x[51000], w[51000], f[51000], fa[51000], top[51000],
    s[51000], son[51000], size[51000], deep[51000];
void dfs1(int x) {
  size[x] = 1;
  deep[x] = deep[fa[x]] + 1;
  for (int i = 0; i < g[x].size(); i++) {
    dfs1(g[x][i]);
    size[x] += size[g[x][i]];
    if (size[g[x][i]] > size[son[x]]) son[x] = g[x][i];
  }
}
void dfs2(int x, int h) {
  s[x] = ++s[0];
  top[x] = h;
  if (son[x]) {
    dfs2(son[x], h);
    for (int i = 0; i < g[x].size(); i++)
      if (g[x][i] != son[x]) dfs2(g[x][i], g[x][i]);
  }
}
void down(int x) {
  if (t[x].l != t[x].r) {
    int k = x * 2;
    if (t[x].f) {
      t[k].sum = t[k].add = 0;
      t[k].f = 1;
    }
    t[k].sum += (t[k].r - t[k].l + 1) * t[x].add;
    t[k].add += t[x].add;
    k = x * 2 + 1;
    if (t[x].f) {
      t[k].sum = t[k].add = 0;
      t[k].f = 1;
    }
    t[k].sum += (t[k].r - t[k].l + 1) * t[x].add;
    t[k].add += t[x].add;
  }
  t[x].f = 0;
  t[x].add = 0;
}
void add(int x, int l, int r, int h) {
  down(x);
  if (t[x].r < l || t[x].l > r) return;
  if (l <= t[x].l && t[x].r <= r) {
    t[x].add = h;
    t[x].sum += (t[x].r - t[x].l + 1) * h;
    return;
  }
  add(x * 2, l, r, h);
  add(x * 2 + 1, l, r, h);
  t[x].sum = t[x * 2].sum + t[x * 2 + 1].sum;
}
double ask(int x, int l, int r) {
  down(x);
  if (t[x].r < l || t[x].l > r) return 0;
  if (l <= t[x].l && t[x].r <= r) return t[x].sum;
  return ask(x * 2, l, r) + ask(x * 2 + 1, l, r);
}
void build(int x, int l, int r) {
  t[x].sum = t[x].add = 0;
  t[x].l = l;
  t[x].r = r;
  if (l == r) return;
  int mid = (l + r) / 2;
  build(x * 2, l, mid);
  build(x * 2 + 1, mid + 1, r);
}
int main() {
  scanf("%d%d%d%lf", &n, &m, &q, &C);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &f[i]);
    pp[f[i]].push_back(i);
  }
  for (int i = 2; i <= n; i++) {
    scanf("%d", &fa[i]);
    g[fa[i]].push_back(i);
  }
  for (int i = 1; i <= m; i++) scanf("%lf", &c[i]);
  for (int i = 1; i <= q; i++) {
    scanf("%d", &b[i]);
    if (b[i] == 1) {
      scanf("%d%d", &x[i], &w[i]);
      if (f[x[i]] != w[i]) {
        p[f[x[i]]].push_back(i);
        p[w[i]].push_back(i);
        f[x[i]] = w[i];
      }
    } else {
      scanf("%d", &w[i]);
      p[w[i]].push_back(i);
    }
  }
  dfs1(1);
  dfs2(1, 1);
  build(1, 1, n);
  for (int i = 1; i <= m; i++) {
    t[1].sum = t[1].add = 0;
    t[1].f = 1;
    for (int j = 0; j < pp[i].size(); j++) {
      int k = pp[i][j];
      double ret = 0;
      sum[i] += deep[k];
      sum_2[i] += deep[k];
      while (top[k] != 1) {
        ret += ask(1, s[top[k]], s[k]);
        add(1, s[top[k]], s[k], 1);
        k = fa[top[k]];
      }
      ret += ask(1, s[1], s[k]);
      add(1, s[1], s[k], 1);
      sum_2[i] += 2 * ret;
    }
    for (int j = 0; j < p[i].size(); j++) {
      int u = p[i][j];
      if (b[u] == 1) {
        if (w[u] == i) {
          int k = x[u];
          double ret = 0;
          sum[i] += deep[k];
          sum_2[i] += deep[k];
          while (top[k] != 1) {
            ret += ask(1, s[top[k]], s[k]);
            add(1, s[top[k]], s[k], 1);
            k = fa[top[k]];
          }
          ret += ask(1, s[1], s[k]);
          add(1, s[1], s[k], 1);
          sum_2[i] += 2 * ret;
        } else {
          int k = x[u];
          double ret = 0;
          sum[i] -= deep[k];
          sum_2[i] += deep[k];
          while (top[k] != 1) {
            ret += ask(1, s[top[k]], s[k]);
            add(1, s[top[k]], s[k], -1);
            k = fa[top[k]];
          }
          ret += ask(1, s[1], s[k]);
          add(1, s[1], s[k], -1);
          sum_2[i] -= 2 * ret;
        }
      } else {
        ans[u] = (sum_2[i] / n) * c[i] * c[i];
        ans[u] += C * C;
        ans[u] -= 2 * C * c[i] * (sum[i] / n);
      }
    }
  }
  for (int i = 1; i <= q; i++)
    if (b[i] == 2) printf("%.12lf\n", ans[i]);
  return 0;
}
