func_code_string: #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;   }   