#include <bits/stdc++.h>
using namespace std;
long long sum[333333], sk[333333];
int deg[333333], lo[333333], hi[333333];
char str[333333];
vector<int> G[333333];
int dis, n;
void dfs(int u, int d) {
  lo[u] = ++dis;
  deg[u] = d;
  for (int i = 0; i < G[u].size(); i++) {
    dfs(G[u][i], d + 1);
  }
  hi[u] = dis;
}
int lowbit(int x) { return x & -x; }
void add(long long *c, int x, long long d) {
  while (x <= n) {
    c[x] = (c[x] + d) % 1000000007;
    x += lowbit(x);
  }
}
long long query(long long *c, int x) {
  long long ret = 0;
  while (x > 0) {
    ret = (ret + c[x]) % 1000000007;
    x -= lowbit(x);
  }
  return ret;
}
int main() {
  while (scanf("%d", &n) != EOF) {
    memset(sum, 0, sizeof(sum));
    memset(sk, 0, sizeof(sk));
    memset(deg, 0, sizeof(deg));
    for (int i = 1; i <= n; i++) G[i].clear();
    for (int i = 2; i <= n; i++) {
      int fa;
      scanf("%d", &fa);
      G[fa].push_back(i);
    }
    dis = 0;
    dfs(1, 0);
    int m;
    scanf("%d", &m);
    while (m--) {
      int op, v;
      long long k, x;
      scanf("%d", &op);
      if (op == 1) {
        scanf("%d%I64d%I64d", &v, &x, &k);
        add(sum, lo[v], x + k * deg[v]);
        add(sum, hi[v] + 1, -(x + k * deg[v]));
        add(sk, lo[v], k);
        add(sk, hi[v] + 1, -k);
      } else {
        scanf("%d", &v);
        long long ans = query(sum, lo[v]) - query(sk, lo[v]) * deg[v];
        printf("%I64d\n", (ans % 1000000007 + 1000000007) % 1000000007);
      }
    }
  }
  return 0;
}
