func_code_string: #include <bits/stdc++.h>   using namespace std;   int read() {     bool f = 0;     int x = 0;     char c = getchar();     while (c <  0  ||  9  < c) {       if (c ==  - ) f = 1;       c = getchar();     }     while ( 0  <= c && c <=  9 )       x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();     return !f ? x : -x;   }   const int MAXN = 200000;   const int INF = 0x3f3f3f3f;   int fa[MAXN + 5], ch[MAXN + 5][2];   long long a[MAXN + 5], siz[MAXN + 5], sum[MAXN + 5], ans[MAXN + 5],       all[MAXN + 5], ad[MAXN + 5], de[MAXN + 5];   bool pan(int u) { return ch[fa[u]][1] == u; }   bool isroot(int u) { return (ch[fa[u]][0] != u && ch[fa[u]][1] != u); }   void PushUp(int u) {     sum[u] = sum[ch[u][0]] + sum[ch[u][1]] + siz[u];     all[u] = all[ch[u][0]] + all[ch[u][1]] + siz[u] * a[u];     ans[u] = ans[ch[u][0]] + ans[ch[u][1]] + ad[u] +              a[u] * (siz[u] * siz[u] - de[u]) +              2 * a[u] * siz[u] * sum[ch[u][1]] +              2 * all[ch[u][0]] * (sum[u] - sum[ch[u][0]]);     return;   }   void Rotate(int x) {     int y = fa[x], z = fa[y], dx = pan(x), dy = pan(y), w = ch[x][dx ^ 1];     if (!isroot(y)) ch[z][dy] = x;     ch[x][dx ^ 1] = y, ch[y][dx] = w;     if (w) fa[w] = y;     fa[y] = x, fa[x] = z;     PushUp(y);     return;   }   void Splay(int x) {     for (int y = fa[x]; !isroot(x); Rotate(x), y = fa[x])       if (!isroot(y)) Rotate(pan(x) == pan(y) ? y : x);     PushUp(x);     return;   }   int Access(int x) {     int y = 0;     while (x) {       Splay(x);       siz[x] -= sum[y];       ad[x] -= ans[y];       de[x] -= sum[y] * sum[y];       siz[x] += sum[ch[x][1]];       ad[x] += ans[ch[x][1]];       de[x] += sum[ch[x][1]] * sum[ch[x][1]];       ch[x][1] = y, PushUp(x), y = x, x = fa[x];     }     return y;   }   void Link(int x, int y) {     Access(y);     Splay(y);     Access(x);     Splay(x);     fa[y] = x;     siz[x] += sum[y];     ad[x] += ans[y];     de[x] += 1ll * sum[y] * sum[y];     PushUp(x);     return;   }   void Cut(int x, int y) {     Access(x);     Splay(x);     Splay(y);     siz[x] -= sum[y];     ad[x] -= ans[y];     de[x] -= 1ll * sum[y] * sum[y];     fa[y] = 0;     PushUp(x);     return;   }   char Re[5];   int f[MAXN + 5];   bool check(int x, int y) {     Access(y);     Splay(y), Splay(x);     return !isroot(y);   }   int main() {     int n = read();     for (int i = 2; i <= n; i++) f[i] = read();     for (int i = 1; i <= n; i++)       a[i] = read(), sum[i] = siz[i] = 1, ans[i] = all[i] = a[i];     for (int i = 2; i <= n; i++) Link(f[i], i);     Access(1), Splay(1);     printf( %.10f n , 1.0 * ans[1] / n / n);     int m = read();     for (int i = 1; i <= m; i++) {       scanf( %s , Re);       if (Re[0] ==  P ) {         int x = read(), y = read();         if (f[x] == y || f[y] == x) goto Break;         if (check(x, y)) swap(x, y);         Cut(f[x], x), f[x] = y;         Link(f[x], x);       } else {         int x = read(), y = read();         Access(x), Splay(x);         a[x] = y;         PushUp(x);       }     Break:       Access(1), Splay(1);       printf( %.10f n , 1.0 * ans[1] / n / n);     }     return 0;   }   