#include <bits/stdc++.h>
using namespace std;
const int MAXN = 300100;
const int offset = (1 << 19);
const int mod = 1e9 + 7;
long long add(long long a, long long b) { return ((a + b) % mod + mod) % mod; }
long long mul(long long a, long long b) { return (((long long)a * b) % mod); }
struct tournement {
  long long p[offset * 2];
  void init() { memset(p, 0, sizeof p); }
  long long kveri(int x) {
    x += offset;
    long long ret = 0;
    for (int i = x; i > 0; i /= 2) ret = add(ret, p[i]);
    return ret;
  }
  void update(int cvor, int a, int b, int lo, int hi, long long k) {
    if (a >= lo && b <= hi) {
      p[cvor] = add(p[cvor], k);
      return;
    }
    if (a > hi || b < lo) return;
    int mid = (a + b) >> 1;
    update(cvor * 2, a, mid, lo, hi, k);
    update(cvor * 2 + 1, mid + 1, b, lo, hi, k);
  }
} T, T1;
int n, q, lvl[MAXN], dis[MAXN], tajm, fin[MAXN];
vector<int> v[MAXN];
void dfs(int cvor, int d) {
  lvl[cvor] = d;
  tajm++;
  dis[cvor] = tajm;
  for (int i = (0); i < int((int)v[cvor].size()); i++) {
    int ncvor = v[cvor][i];
    if (lvl[ncvor] != 0) continue;
    dfs(ncvor, d + 1);
  }
  fin[cvor] = tajm;
}
int main() {
  scanf("%d", &n);
  for (int i = (0); i < int(n - 1); i++) {
    int x;
    scanf("%d", &x);
    v[x].push_back(i + 2);
  }
  dfs(1, 1);
  scanf("%d", &q);
  while (q--) {
    int tip;
    scanf("%d", &tip);
    if (tip == 1) {
      int a, x, k;
      scanf("%d %d %d", &a, &x, &k);
      T.update(1, 0, offset - 1, dis[a], fin[a],
               add((long long)x, mul((long long)lvl[a], k)));
      T1.update(1, 0, offset - 1, dis[a], fin[a], (long long)k);
    } else {
      int a;
      scanf("%d", &a);
      printf("%I64d\n", add(T.kveri(dis[a]), -mul(T1.kveri(dis[a]), lvl[a])));
    }
  }
  return 0;
}
