#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
class BIT {
  long long MX, *bit;

 public:
  BIT() {
    MX = 0;
    bit = NULL;
  };
  void init(int N) {
    MX = N;
    bit = new long long[MX + 1];
    for (int j = 0; j <= MX; j++) bit[j] = 0;
  }
  int get(int x) {
    long long ret = 0;
    while (x > 0) {
      ret += bit[x];
      ret += MOD;
      ret %= MOD;
      x -= x & (-x);
    }
    return ret;
  }
  void add(int x, int V) {
    while (x <= MX) {
      bit[x] += V;
      bit[x] += MOD;
      bit[x] %= MOD;
      x += x & (-x);
    }
  }
} tree1, tree2;
const int MX = (1 << 20);
int in[MX], out[MX], n, timer, depth[MX];
vector<int> v[MX];
void dfs(int x) {
  in[x] = ++timer;
  for (auto nxt : v[x]) {
    depth[nxt] = depth[x] + 1;
    dfs(nxt);
  }
  out[x] = timer;
}
int main() {
  scanf("%d", &n);
  for (int j = 2; j <= n; j++) {
    int x;
    scanf("%d", &x);
    v[x].push_back(j);
  }
  dfs(1);
  int QN;
  scanf("%d", &QN);
  tree1.init(n);
  tree2.init(n);
  while (QN--) {
    int cmd, node;
    scanf("%d %d", &cmd, &node);
    if (cmd == 2) {
      long long ans = tree2.get(in[node]);
      ans += MOD;
      ans %= MOD;
      ans *= 1ll * depth[node];
      ans %= MOD;
      long long theta = tree1.get(in[node]);
      swap(ans, theta);
      ans -= theta;
      while (ans < 0) ans += MOD;
      ans %= MOD;
      printf("%lld\n", ans);
    } else {
      int X, K;
      scanf("%d %d", &X, &K);
      tree2.add(in[node], K);
      tree2.add(out[node] + 1, -K);
      long long theta = X + 1ll * depth[node] * K;
      theta %= MOD;
      tree1.add(in[node], theta);
      tree1.add(out[node] + 1, -theta);
    }
  }
}
