#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")
#pragma GCC optimize("O1")
#pragma GCC optimize("O1")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#define int long long
#define cint const int
#define ii pair<int, int>
#define fi first
#define se second
#define vi vector<int>
#define vii vector<vi>
#define pb push_back
#define pq priority_queue
#define mid(l, r) ((l + r) >> 1)
#define left(id) (id << 1)
#define right(id) (id << 1 1)
#define cntbit(mask) __builtin_popcountll(mask)
#define BIT(mask, i) (mask & (1ll << (i)))
#define ONBIT(mask, i) (mask | (1ll << (i)))
const int MAXN = 1015;
const int MOD = 1e9 + 7;
int N, Q;
vector<int> g[MAXN];
int d[MAXN];
int par[MAXN], ans[MAXN], dp[MAXN];
void DFS(int u, int p) {
vector<int> tmp;
for (auto v : g[u]) {
if (v == p) continue;
DFS(v, u);
tmp.pb(d[v] + dp[v]);
dp[u] = max(dp[u], dp[v] + d[v]);
}
if (tmp.size() == 0) ans[u] = 0;
if (tmp.size() == 1) ans[u] = tmp[0];
if (tmp.size() >= 2) {
sort(tmp.begin(), tmp.end(), greater<int>());
ans[u] = tmp[0] + tmp[1];
ans[u] %= MOD;
}
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> N;
for (int i = 1; i < N; i++) {
int u;
cin >> u;
par[i] = u;
g[i].pb(u);
g[u].pb(i);
}
for (int i = 1; i < N; i++) {
int dd;
cin >> dd;
d[i] = dd;
}
DFS(0, -1);
int res = 0;
for (int i = 0; i <= N - 1; i++) {
res += ans[i];
res %= MOD;
}
cout << res << '\n';
cin >> Q;
for (int i = 1; i <= Q; i++) {
for (int j = 0; j < N; j++) ans[j] = 0;
int u, add;
cin >> u >> add;
d[u] += add;
DFS(0, -1);
int res = 0;
for (int j = 0; j < N; j++) {
res += ans[j];
res %= MOD;
}
cout << res << '\n';
}
}