You have a root tree containing n vertexes. Let's number the tree vertexes with integers from 1 to n. The tree root is in the vertex 1.

Each vertex (except fot the tree root) v has a direct ancestor pv. Also each vertex v has its integer value sv. 

Your task is to perform following queries:

  * P v u (u ≠ v). If u isn't in subtree of v, you must perform the assignment pv = u. Otherwise you must perform assignment pu = v. Note that after this query the graph continues to be a tree consisting of n vertexes.
  * V v t. Perform assignment sv = t. 



Your task is following. Before starting performing queries and after each query you have to calculate expected value written on the lowest common ancestor of two equiprobably selected vertices i and j. Here lowest common ancestor of i and j is the deepest vertex that lies on the both of the path from the root to vertex i and the path from the root to vertex j. Please note that the vertices i and j can be the same (in this case their lowest common ancestor coincides with them).

Input

The first line of the input contains integer n (2 ≤ n ≤ 5·104) — the number of the tree vertexes. 

The second line contains n - 1 integer p2, p3, ..., pn (1 ≤ pi ≤ n) — the description of the tree edges. It is guaranteed that those numbers form a tree.

The third line contains n integers — s1, s2, ... sn (0 ≤ si ≤ 106) — the values written on each vertex of the tree.

The next line contains integer q (1 ≤ q ≤ 5·104) — the number of queries. Each of the following q lines contains the description of the query in the format described in the statement. It is guaranteed that query arguments u and v lie between 1 and n. It is guaranteed that argument t in the queries of type V meets limits 0 ≤ t ≤ 106.

Output

Print q + 1 number — the corresponding expected values. Your answer will be considered correct if its absolute or relative error doesn't exceed 10 - 9.

Examples

Input

5
1 2 2 1
1 2 3 4 5
5
P 3 4
P 4 5
V 2 3
P 5 2
P 1 4


Output

1.640000000
1.800000000
2.280000000
2.320000000
2.800000000
1.840000000

Note

Note that in the query P v u if u lies in subtree of v you must perform assignment pu = v. An example of such case is the last query in the sample.
#include <bits/stdc++.h>
using namespace std;
void read(int &x) {
  int f = 1;
  x = 0;
  char s = getchar();
  while (s < '0' || s > '9') {
    if (s == '-') f = -1;
    s = getchar();
  }
  while (s >= '0' && s <= '9') {
    x = x * 10 + s - '0';
    s = getchar();
  }
  x *= f;
}
const int N = 1e5;
struct SplayNode {
  int son[2], fa;
  long long sz01, sz11, sz02, sum, ans0, ans;
} spl[N + 3];
int fa[N + 3];
long long a[N + 3];
int n, q;
bool isroot(int u) {
  return spl[spl[u].fa].son[0] != u && spl[spl[u].fa].son[1] != u;
}
void pushup(int u) {
  int ls = spl[u].son[0], rs = spl[u].son[1];
  spl[u].sz11 = spl[ls].sz11 + spl[u].sz01 + spl[rs].sz11;
  spl[u].sum = spl[ls].sum + spl[rs].sum + spl[u].sz01 * a[u];
  spl[u].ans = spl[ls].ans + spl[u].ans0 + spl[rs].ans;
  spl[u].ans += (spl[u].sz01 * spl[u].sz01 - spl[u].sz02) * a[u];
  spl[u].ans += 2ll * spl[u].sz01 * spl[rs].sz11 * a[u];
  spl[u].ans += 2ll * spl[ls].sum * (spl[u].sz11 - spl[ls].sz11);
}
void rotate(int u) {
  int x = spl[u].fa, y = spl[x].fa;
  spl[u].fa = y;
  if (!isroot(x)) {
    spl[y].son[x == spl[y].son[1]] = u;
  }
  int dir = u == spl[x].son[0];
  spl[x].son[dir ^ 1] = spl[u].son[dir];
  if (spl[u].son[dir]) {
    spl[spl[u].son[dir]].fa = x;
  }
  spl[u].son[dir] = x;
  spl[x].fa = u;
  pushup(x);
  pushup(u);
}
void splaynode(int u) {
  while (!isroot(u)) {
    int x = spl[u].fa, y = spl[x].fa;
    if (!isroot(x)) {
      x == spl[y].son[1] ^ u == spl[x].son[1] ? rotate(u) : rotate(x);
    }
    rotate(u);
  }
  pushup(u);
}
void access(int u) {
  for (int i = 0; u; i = u, u = spl[u].fa) {
    splaynode(u);
    int ls = spl[u].son[0], rs = spl[u].son[1];
    spl[u].sz01 += spl[rs].sz11;
    spl[u].sz02 += spl[rs].sz11 * spl[rs].sz11;
    spl[u].ans0 += spl[rs].ans;
    rs = spl[u].son[1] = i;
    spl[u].sz01 -= spl[rs].sz11;
    spl[u].sz02 -= spl[rs].sz11 * spl[rs].sz11;
    spl[u].ans0 -= spl[rs].ans;
    pushup(u);
  }
}
void link(int u, int v) {
  access(v);
  splaynode(v);
  access(u);
  splaynode(u);
  spl[u].sz01 += spl[v].sz11;
  spl[u].sz02 += spl[v].sz11 * spl[v].sz11;
  spl[u].ans0 += spl[v].ans;
  spl[v].fa = u;
  pushup(u);
}
void cut(int u, int v) {
  access(u);
  splaynode(u);
  splaynode(v);
  spl[u].sz01 -= spl[v].sz11;
  spl[u].sz02 -= spl[v].sz11 * spl[v].sz11;
  spl[u].ans0 -= spl[v].ans;
  spl[v].fa = 0;
  pushup(u);
}
bool isanc(int u, int v) {
  access(v);
  splaynode(v);
  splaynode(u);
  if (!isroot(v)) return true;
  return false;
}
void printans(long long x) {
  double ans = (double)x / (double)n / (double)n;
  printf("%.12lf\n", ans);
}
int main() {
  scanf("%d", &n);
  for (int i = 2; i <= n; i++) scanf("%d", &fa[i]);
  for (int i = 1; i <= n; i++) scanf("%I64d", &a[i]);
  for (int i = 1; i <= n; i++)
    spl[i].sz11 = spl[i].sz01 = 1ll, spl[i].ans = spl[i].sum = a[i];
  for (int i = 2; i <= n; i++) {
    link(fa[i], i);
  }
  access(1);
  splaynode(1);
  printans(spl[1].ans);
  scanf("%d", &q);
  for (int i = 1; i <= q; i++) {
    char opt[5];
    scanf("%s", opt + 1);
    if (opt[1] == 'P') {
      int x, y;
      scanf("%d%d", &x, &y);
      if (isanc(x, y)) {
        swap(x, y);
      }
      cut(fa[x], x);
      fa[x] = y;
      link(fa[x], x);
      access(1);
      splaynode(1);
      printans(spl[1].ans);
    } else if (opt[1] == 'V') {
      int x;
      long long y;
      scanf("%d%I64d", &x, &y);
      access(x);
      splaynode(x);
      a[x] = y;
      pushup(x);
      printans(spl[x].ans);
    }
  }
  return 0;
}
