#include <bits/stdc++.h>
using namespace std;
long long int Pow(long long int a, long long int b, long long int md,
                  long long int ans = 1) {
  for (; b; b >>= 1, a = a * a % md)
    if (b & 1) ans = ans * a % md;
  return ans % md;
}
const long long int MAXN = 3e5 + 10;
const long long int INF = 8e18;
const long long int MOD = 1e9 + 7;
long long int fen[3][MAXN], L[MAXN], R[MAXN], H[MAXN], n, q, timer = 1;
vector<long long int> adj[MAXN];
void update(long long int id, long long int pos, long long int val) {
  val %= MOD;
  for (; pos < MAXN; pos += pos & -pos) {
    fen[id][pos] = (fen[id][pos] + val + MOD) % MOD;
  }
}
long long int get(long long int id, long long int pos, long long int res = 0) {
  for (; pos; pos -= pos & -pos) {
    res = (res + fen[id][pos] + MOD) % MOD;
  }
  return res;
}
void DFS(long long int v) {
  L[v] = timer++;
  for (long long int u : adj[v]) {
    H[u] = H[v] + 1;
    DFS(u);
  }
  R[v] = timer;
}
int main() {
  scanf("%lld", &n);
  for (long long int i = 2; i <= n; i++) {
    long long int p;
    scanf("%lld", &p);
    adj[p].push_back(i);
  }
  DFS(1);
  scanf("%lld", &q);
  while (q--) {
    long long int t, v, x, k;
    scanf("%lld%lld", &t, &v);
    if (t == 2) {
      printf("%lld\n", ((get(0, L[v]) + get(1, L[v])) % MOD -
                        get(2, L[v]) * H[v] % MOD + MOD) %
                           MOD);
    } else {
      scanf("%lld%lld", &x, &k);
      update(0, L[v], x);
      update(0, R[v], -x);
      update(1, L[v], H[v] * k);
      update(1, R[v], -H[v] * k);
      update(2, L[v], k);
      update(2, R[v], -k);
    }
  }
  return 0;
}
