#include using namespace std; using ll = long long; template using vec = vector; template using vvec = vector>; template struct LazySegmentTree { int sz,height; vec data; vec lazy; const F op; const G homo; const H comp; const Monoid e; const OperatorMonoid Oe; LazySegmentTree(int n,const F op,const G homo,const H comp, const Monoid &e,const OperatorMonoid Oe) : op(op),homo(homo),comp(comp),e(e),Oe(Oe) { sz = 1; height = 0; while(sz<=n) sz <<= 1,height++; data.assign(2*sz,e); lazy.assign(2*sz,Oe); } void set(int k,const Monoid &x) { data[k+sz] = x; } void build() { for(int k=sz-1;k>0;k--) { data[k] = op(data[2*k], data[2*k+1]); } } inline void propagate(int k) { if(lazy[k]!=Oe) { lazy[2*k] = comp(lazy[2*k], lazy[k]); lazy[2*k+1] = comp(lazy[2*k+1], lazy[k]); data[k] = reflect(k); lazy[k] = Oe; } } inline Monoid reflect(int k) { return lazy[k] == Oe? data[k]:homo(data[k],lazy[k]); } inline void recalc(int k) { while(k>>=1) data[k] = op(reflect(2*k), reflect(2*k+1)); } inline void thrust(int k) { for(int i=height;i>0;i--) propagate(k>>i); } void update(int a, int b, const OperatorMonoid &x) { thrust(a+=sz); thrust(b+=sz-1); for(int l=a,r=b+1;l>=1,r>>=1) { if(l&1) lazy[l] = comp(lazy[l],x),++l; if(r&1) --r, lazy[r] = comp(lazy[r],x); } recalc(a); recalc(b); } Monoid query(int a, int b) { thrust(a+=sz); thrust(b+=sz-1); Monoid L = e, R = e; for(int l=a, r=b+1;l>= 1,r>>=1) { if(l&1) L = op(L,reflect(l++)); if(r&1) R = op(reflect(--r),R); } return op(L,R); } Monoid operator[](const int &k) { return query(k,k+1); } }; struct edge{ int to,id; ll dist; edge(int to,ll dist=1,int id=1):to(to),id(id),dist(dist){}; }; class HeavLightDecomposition{ private: vvec g; vec sz,in,out,head,par; int pos; void dfs_sz(int cur,int p){ sz[cur] = 1; par[cur] = p; for(auto& e:g[cur]) if(e.to!=p){ dfs_sz(e.to,cur); sz[cur] += sz[e.to]; if(sz[e.to]>sz[g[cur][0].to]) swap(e,g[cur][0]); } } void dfs_hld(int cur,int p){ in[cur] = pos++; for(auto& e:g[cur]) if(e.to!=p){ head[e.to] = (e.to==g[cur][0].to? head[cur]:e.to); dfs_hld(e.to,cur); } out[cur] = pos; } public: HeavLightDecomposition(){} HeavLightDecomposition(int N,int root,vvec tree): g(tree),sz(N),in(N),out(N),head(N),par(N){ pos = 0; dfs_sz(root,-1); dfs_hld(root,-1); } int getin(int v){return in[v];} int getout(int v){return out[v];} int lca(int u,int v){ while(true){ if(in[u]>in[v]) swap(u,v); if(head[u]==head[v]) return u; v = par[head[v]]; } } template void update(int v,const T& x,const G& g){ g(in[v]+1,out[v],x); } template T query(int u,int v,const T &e,const F& f,const Q& q,bool isedge=false){ T l = e,r = e; while(true){ if(in[u]>in[v]){ swap(u,v); swap(l,r); } if(head[u]==head[v]) break; l = f(q(in[head[v]],in[v]+1),l); v = par[head[v]]; } return f(f(q(in[u]+isedge,in[v]+1),l),r); } }; int main(){ cin.tie(0); ios::sync_with_stdio(false); int N; cin >> N; vvec tree(N); for(int i=0;i> a >> b >> w; tree[a].push_back({b,w}); } HeavLightDecomposition HLD(N,0,tree); struct state{ ll sum,len; }; auto op = [](state L,state R){ return (state){L.sum+R.sum,L.len+R.len}; }; auto homo = [](state S,ll x){ return (state){S.sum+x*S.len,S.len}; }; auto comp = [](ll a, ll b){return a+b;}; state e = {0,0}; LazySegmentTree seg(N,op,homo,comp,(state){0,0},0); for(int i=0;i> Q; auto q = [&](int l,int r){return seg.query(l,r);}; auto update = [&](int l,int r,ll x){seg.update(l,r,x);}; for(int i=0;i> t; if(t==1){ int v; ll w; cin >> v >> w; HLD.update(v,w,update); }else{ int v; cin >> v; state res = HLD.query(0,v,e,op,q,true); cout << res.sum << endl; } } }