#include template struct Edge { int from, to; T cost; Edge(int from, int to, T cost) { this->from = from; this->to = to; this->cost = cost; } }; bool operator == (Edge e1, Edge e2) { return e1.from == e2.from && e1.to == e2.to && e1.cost == e2.cost; } template using Edges = std::vector>; template using Graph = std::vector>; using namespace std; using ll = long long; using P = pair; using vi = vector; using vvi = vector>; using vll = vector; using vvll = vector>; const double eps = 1e-10; const int MOD = 1000000007; const int INF = 1000000000; const ll LINF = 1ll<<50; template void printv(const vector& s) { for(int i=0;i<(int)(s.size());++i) { cout << s[i]; if(i == (int)(s.size())-1) cout << endl; else cout << " "; } } class LazySegmentTree { int n; using T1 = ll; using T2 = ll; void eval(int k, int l, int r) { if (lazy[k] == 0) return; node[k] = node[k] + lazy[k]; if (r - l > 1) { lazy[2 * k + 1] = lazy[2 * k + 1] + lazy[k] / 2; lazy[2 * k + 2] = lazy[2 * k + 2] + lazy[k] / 2; } lazy[k] = 0; } public: std::vector node; std::vector lazy; LazySegmentTree(int _n) { int sz = _n; n = 1; while (n < sz) n *= 2; node.resize(2 * n - 1, 0); lazy.resize(2 * n - 1, 0); } LazySegmentTree(int _n, T1 _v) { int sz = _n; n = 1; while (n < sz) n *= 2; node.resize(2 * n - 1, 0); lazy.resize(2 * n - 1, 0); for (int i = 0; i < sz; i++) node[i + n - 1] = _v; for (int i = n - 2; i >= 0; i--) node[i] = node[i * 2 + 1] + node[i * 2 + 2]; } void update(int a, int b, T2 val, int l = 0, int r = -1, int k = 0) { if (r < 0) r = n; eval(k, l, r); if (b <= l || r <= a) return; if (a <= l && r <= b) { lazy[k] = lazy[k] + (r - l) * val; eval(k, l, r); } else { int mid = (l + r) / 2; update(a, b, val, l, mid, 2 * k + 1); update(a, b, val, mid, r, 2 * k + 2); node[k] = node[2 * k + 1] + node[2 * k + 2]; } } T1 query(int a, int b, int l = 0, int r = -1, int k = 0) { if (r < 0) r = n; eval(k, l, r); if (b <= l || r <= a) return 0; if (a <= l && r <= b) return node[k]; int mid = (l + r) / 2; T1 vl = query(a, b, l, mid, 2 * k + 1); T1 vr = query(a, b, mid, r, 2 * k + 2); return vl + vr; } }; map pl, mi; void dfs(int now, const Graph &g, vector &dist, vector &depth, int &idx, int &plusidx, int &minusidx, vector &plus, vector &plused, vector &minus, vector &minusbeg) { int sz = g[now].size(); for(int i=0;i> n; Graph g(n); for(int i=0;i> u >> v >> w; g[u].push_back(Edge(u, v, w)); } vector dist(n); vector depth(n); vector plus(n); vector plused(n); vector minus(n); vector minusbeg(n); dist[0] = 0; depth[0] = 0; int idx = 0, plusidx = 0, minusidx = 0; dfs(0, g, dist, depth, idx, plusidx, minusidx, plus, plused, minus, minusbeg); LazySegmentTree lst1(idx), lst2(idx); ll add0 = 0; int q; cin >> q; while(q > 0) { q--; int t; cin >> t; if(t == 1) { int a; ll x; cin >> a >> x; if(a == 0) { add0 += x; continue; } lst1.update(pl[plus[a]]+1, plused[a], x); lst2.update(minusbeg[a], mi[minus[a]], -x); } else { int b; cin >> b; ll ans = dist[b] + add0 * depth[b]; ans += lst1.query(0, pl[plus[b]]+1); ans += lst2.query(0, mi[minus[b]]); cout << ans << endl; } } }