//#define _GLIBCXX_DEBUG #include #define rep(i, n) for(int i=0; i; using vs = vector; using vi = vector; using vvi = vector; template using PQ = priority_queue; template using PQG = priority_queue, greater >; const int INF = 0xccccccc; const ll LINF = 922337203685477580LL; template inline bool chmax(T1 &a, T2 b) {return a < b && (a = b, true);} template inline bool chmin(T1 &a, T2 b) {return a > b && (a = b, true);} template istream &operator>>(istream &is, pair &p) { return is >> p.first >> p.second;} template ostream &operator<<(ostream &os, const pair &p) { return os << p.first << ' ' << p.second;} struct edge { int to; int64_t cost; edge(int x=0, int64_t y=0):to(x), cost(y) {} }; const int N = 1e5+10; //head int n; vector G[N]; int q; int dist[N]; P lr[N]; ll info[N]; ll bit[N][2]; void add(int i, ll x, int w) { while(i <= n) { bit[i][w] += x; i += i&-i; } } ll sum(int i, int w) { ll res = 0; while(i) { res += bit[i][w]; i &= i-1; } return res; } int dfs(int i, int &cnt1, ll npw) { int &res = lr[i].second; lr[i].first = cnt1++; info[i] = npw; for(edge &e:G[i]) { dist[e.to] = dist[i]+1; npw += e.cost; res += dfs(e.to, cnt1, npw); npw -= e.cost; } return ++res; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n; rep(i, n-1) { int a, b, w; cin >> a >> b >> w; G[a].emplace_back(b, w); } int c1 = 0; dfs(0, c1, 0); rep(i, n) { //cout << i << ' ' << info[i] << endl; int pl = lr[i].first; add(pl+1, info[i], 0); add(pl+2, -info[i], 0); } cin >> q; while(q--) { int type; cin >> type; if(type == 1) { int a, x; cin >> a >> x; add(lr[a].first+1, x, 1); add(lr[a].first+lr[a].second+1, -x, 1); add(lr[a].first+1, -(ll)x*dist[a], 0); add(lr[a].first+lr[a].second+1, (ll)x*dist[a], 0); } else { int b; cin >> b; cout << sum(lr[b].first+1, 0) + sum(lr[b].first+1, 1)*dist[b] << '\n'; } } }