#pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include #include using namespace std; using namespace atcoder; #define rep(i,m,n,k) for (int i = (int)(m); i < (int)(n); i += (int)(k)) #define rrep(i,m,n,k) for (int i = (int)(m); i > (int)(n); i += (int)(k)) #define ll long long #define list(T,A,N) vector A(N);for(int i=0;i<(int)(N);i++){cin >> A[i];} template bool chmin(T& a, T b){if(a > b){a = b; return true;} return false;} template bool chmax(T& a, T b){if(a < b){a = b; return true;} return false;} template map Counter(vector X){map C;for(auto x:X){C[x]++;}; return C;} struct HLD{ int N; vector> e; vector par; vector sub; vector dist; vector head; vector depth; vector ID; vector HEAD; vector PAR; vector DEPTH; vector SUB; HLD(vector> &_e, int root = 0){ e = _e; N = (int)(e.size()); par = vector (N,-1); sub = vector (N,-1); dist = vector (N,-1); head = vector (N,-1); depth = vector (N,-1); ID = vector (N,-1); HEAD = vector (N,-1); PAR = vector (N,-1); DEPTH = vector (N,-1); SUB = vector (N,-1); dist[root] = 0; deque v; v.emplace_back(root); int x; while(!v.empty()){ x = v.front();v.pop_front(); for (auto ix:e[x]){ if(dist[ix]!=-1) continue; dist[ix] = dist[x] + 1; v.emplace_back(ix); } } vector> H(N); for(int i=0;i visited(N,false); HEAD[0] = 0; head[root] = 0; depth[root] = 0; DEPTH[0] = 0; int cnt = 0; v.emplace_back(root); SUB[0] = N; vector> h; int flg = 0; int n; while(!v.empty()){ x = v.front();v.pop_front(); visited[x] = true; ID[x] = cnt; cnt ++; n = (int)e[x].size(); h.resize(n); for(int i=0;i> path_query(int l, int r){ int L = ID[l]; int R = ID[r]; pair tmp; vector> res; if(DEPTH[L] sub_query(int k){ int K = ID[k]; return {K,K+SUB[K]}; } }; array ope(array x,array y){ array z; z[0] = x[0]+y[0]; z[1] = x[1]+y[1]; return z; } array e_(){ array z={0}; return z; } array mapping(ll f, array x){ array z; z[0] = x[0]+f*x[1]; z[1] = x[1]; return z; } ll composition(ll f,ll g){ return f+g; } ll id_(){ return 0; } int main(){ int N; cin >> N; vector> e(N); vector W(N); int u,v; ll w; rep(_,0,N-1,1){ cin >> u >> v >> w; e[u].emplace_back(v); e[v].emplace_back(u); W[v] = w; } int Q; cin >> Q; HLD hld(e); vector id = hld.ID; vector> B(N,array {0}); rep(i,0,N,1){ B[id[i]][0] = W[i]; B[id[i]][1] = 1; } lazy_segtree,ope,e_,ll,mapping,composition,id_> T(B); int flg,l,r,b,a; ll x,tmp; rep(_,0,Q,1){ cin >> flg; if(flg==1){ cin >> a >> x; auto [l,r] = hld.sub_query(a); T.apply(l+1,r,x); } else{ cin >> b; tmp = 0; for(auto lr:hld.path_query(0,b)){ l = lr.first; r = lr.second; tmp += T.prod(l,r)[0]; } cout << tmp << endl; } } return 0; }