#include <bits/stdc++.h>
using namespace std;
const int N = 301000, p = 1000000007;
int n, m, C, v, t;
long long x, k, c[N], c2[N];
struct Node {
  vector<int> ch;
  int p, l, r, d, id;
} a[N];
void dfs(int x) {
  a[x].id = a[x].l = ++t;
  for (int i = 0; i < a[x].ch.size(); i++) {
    int y = a[x].ch[i];
    a[y].d = a[x].d + 1;
    dfs(y);
  }
  a[x].r = t;
}
void add(int x, long long d) {
  for (; x <= n; x += x & -x) c[x] = (c[x] + d) % p;
}
long long get(int x) {
  long long ans = 0;
  for (; x > 0; x -= x & -x) ans = (ans + c[x]) % p;
  return ans;
}
void add2(int x, long long d) {
  for (; x <= n; x += x & -x) c2[x] = (c2[x] + d) % p;
}
long long get2(int x) {
  long long ans = 0;
  for (; x > 0; x -= x & -x) ans = (ans + c2[x]) % p;
  return ans;
}
void Add(int l, int r, long long d, long long d2) {
  add(l, d);
  add(r + 1, -d);
  add2(l, d2);
  add2(r + 1, -d2);
}
int Get(int x, int t) { return ((get(x) - t * get2(x)) % p + p) % p; }
int main() {
  scanf("%d", &n);
  for (int i = 2; i <= n; i++) {
    scanf("%d", &a[i].p);
    a[a[i].p].ch.push_back(i);
  }
  dfs(1);
  scanf("%d", &m);
  while (m--) {
    scanf("%d", &C);
    if (C == 1) {
      scanf("%d%I64d%I64d", &v, &x, &k);
      Add(a[v].l, a[v].r, x + a[v].d * k, k);
    } else {
      scanf("%d", &v);
      printf("%d\n", Get(a[v].id, a[v].d));
    }
  }
  return 0;
}
