#include <bits/stdc++.h>
using namespace std;
struct node : vector<int> {
  long long depth;
  int en;
  int invi;
};
struct rngnode {
  long long k, x;
  rngnode() : k(0), x(0) {}
};
int indfn;
void dfs(int act, node* nodes, int p) {
  nodes[act].depth = p;
  nodes[act].invi = ++indfn;
  for (int i = 0; i < (int)nodes[act].size(); i++)
    dfs(nodes[act][i], nodes, p + 1);
  nodes[act].en = indfn;
}
void update(rngnode* segt, int ind, int l, int r, int la, int ra, long long x,
            long long k) {
  if (l > ra || r < la) return;
  if (la >= l && ra <= r) {
    segt[ind].x = (segt[ind].x + (x % 1000000007)) % 1000000007;
    segt[ind].k = (segt[ind].k + (k % 1000000007)) % 1000000007;
    return;
  }
  update(segt, 2 * ind, l, r, la, (la + ra) / 2, x, k);
  update(segt, 2 * ind + 1, l, r, (la + ra) / 2 + 1, ra, x, k);
}
bool p2(int x) {
  if (x == 0) return false;
  return (x & (x - 1)) == 0;
}
int main() {
  indfn = 0;
  int N;
  scanf("%d", &N);
  int n2 = N;
  while (!p2(n2)) n2++;
  node nodes[N + 1];
  rngnode segment[2 * n2];
  for (int i = 0, a; i < N - 1; i++) {
    scanf("%d", &a);
    nodes[a].push_back(i + 2);
  }
  dfs(1, nodes, 0);
  int Q;
  scanf("%d", &Q);
  for (int q = 0; q < Q; q++) {
    int t;
    scanf("%d", &t);
    if (t == 1) {
      int v;
      long long x, k;
      scanf("%d%lld%lld", &v, &x, &k);
      x += nodes[v].depth * k;
      update(segment, 1, nodes[v].invi, nodes[v].en, 1, n2, x, k);
    } else {
      int v;
      scanf("%d", &v);
      int st = n2 + nodes[v].invi - 1;
      long long tot = 0;
      for (int i = st; i >= 1; i /= 2)
        tot = (tot + segment[i].x -
               ((nodes[v].depth * segment[i].k) % 1000000007) + 1000000007) %
              1000000007;
      printf("%lld\n", tot);
    }
  }
  return 0;
}
