#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';
    }
}