func_code_string: #include <bits/stdc++.h>   using namespace std;   struct node {     node *l, *r, *p;     long long v, s, z, w, t, k, i;     node(long long v, long long i)         : l(0), r(0), p(0), v(v), s(1), z(0), w(0), t(v), k(1), i(i) {}   };   inline bool is_root(node *n) {     return n->p == NULL || n->p->l != n && n->p->r != n;   }   inline bool left(node *n) { return n == n->p->l; }   inline long long size(node *n) { return n ? n->s + n->z : 0; }   inline long long tot(node *n) { return n ? n->t : 0; }   inline void push(node *n) {     n->s += n->z;     n->w += n->z;     n->k += 2 * n->z * (n->s - n->w);     if (n->l) n->l->z += n->z;     if (n->r) n->r->z += n->z;     n->z = 0;   }   inline void update(node *n) {     push(n);     n->t = tot(n->l) + tot(n->r) + n->v * (n->s - n->w);   }   inline void connect(node *n, node *p, bool l) {     (l ? p->l : p->r) = n;     if (n) n->p = p;   }   inline void rotate(node *n) {     node *p = n->p, *g = p->p;     bool l = left(n);     connect(l ? n->r : n->l, p, l);     if (!is_root(p))       connect(n, g, left(p));     else       n->p = g;     connect(p, n, !l);     update(p), update(n);   }   inline void splay(node *n) {     while (!is_root(n)) {       node *p = n->p, *g = p->p;       if (!is_root(p)) push(g);       push(p), push(n);       if (!is_root(p)) rotate(left(n) ^ left(p) ? n : p);       rotate(n);     }     push(n);   }   inline node *find_root(node *n) {     if (n == NULL) return NULL;     while (n->l) {       push(n);       n = n->l;     }     return n;   }   inline node *expose(node *n) {     node *last = NULL;     for (node *m = n; m; m = m->p) {       splay(m);       m->w = size(find_root(last));       m->r = last;       last = m;       update(m);     }     splay(n);     return last;   }   void link(node *m, node *n) {     expose(m), expose(n);     m->p = n;     n->z += size(m);   }   void cut(node *n) {     expose(n);     n->l->z -= size(n);     n->l->p = NULL;     n->l = NULL;   }   node *lca(node *m, node *n) {     expose(m);     return expose(n);   }   const int MAXN = 50005;   long long N, M, P[MAXN], A, B, ans;   char C;   node *V[MAXN];   int main() {     cin >> N;     cout << fixed << setprecision(9);     for (int i = 1; i < N; i++) {       cin >> P[i];       P[i]--;     }     for (int i = 0; i < N; i++) {       int v;       cin >> v;       V[i] = new node(v, i);       ans += v;     }     for (int i = 1; i < N; i++) {       link(V[i], V[P[i]]);       ans += 2 * tot(V[P[i]]) * size(V[i]);     }     cout << 1.0 * ans / N / N <<   n ;     cin >> M;     while (M--) {       cin >> C >> A >> B;       if (C ==  P ) {         node *v = V[A - 1], *u = V[B - 1];         if (lca(u, v) == v) swap(u, v);         expose(v);         ans -= 2 * tot(v->l) * size(v);         cut(v);         link(v, u);         ans += 2 * tot(u) * size(v);       } else {         node *v = V[A - 1];         expose(v);         update(v);         ans += (B - v->v) * v->k;         v->v = B;       }       cout << 1.0 * ans / N / N <<   n ;     }   }   