#include<bits/stdc++.h>
using namespace std;
#define fur(i,n,m,k) for(int i = (n) ; i < (m) ; i += k)
#define fr(i,n,m,k) for(int i = (n - 1) ; i >= (m) ; i -= k)
#define pub push_back
#define pop pop_back
#define Sz size()
#define F first
#define lob lower_bound
#define S second
#define B begin()
#define E end()
typedef pair<int,int> pii;
typedef long long ll;
typedef pair<ll,ll> pll;
typedef long double ld;
typedef  vector<ll> vll;
const int N=4e5+5;
ll n, t, ba[N], tol, ans[N], a[N], b, x, k, i;
pll e[N];
vll adj[N];
bool mk[N];
deque<ll> q;
inline void dfs(ll u=q.front()){
	mk[u]=1;
	q.pop();
	for(ll i=0; i<adj[u].size(); i++){
		ll v=adj[u][i];
		if(mk[v]==0){
			a[v]+=a[u];
			if(mk[v])q.push_front(v);
			else q.pub(v);
			dfs();
		}
	}	
}
inline void find_ba(ll u){
	mk[u]=1;
	for(ll i=0; i<adj[u].size(); i++){
		ll v=adj[u][i];
		if(mk[v]==0){
			find_ba(v);
			ba[v]=u;
		}
	}
}
int main(){ 
	cin>>n;
	for(i=1; i<n; i++){
		cin>>e[i].F>>e[i].S; 
		adj[e[i].F].pub(e[i].S);
		adj[e[i].S].pub(e[i].F);
	}
	cin>>k;
	find_ba(1);
	while(k--){
		cin>>t>>i>>x;
		if(t==1){
			
			if(e[i].F==ba[e[i].S]){
				tol+=x;
				a[e[i].S]-=x;
			}
			else{
				a[e[i].F]+=x;
			}
		}
		else{
			if(e[i].S==ba[e[i].F]){
				tol+=x;
				a[e[i].F]-=x;	
			}
			else{
				a[e[i].S]+=x;
			}
		} 
	}
	fill(mk, mk+n+1, 0);
	q.pub(1);
	dfs();
	for(ll i=1; i<=n; i++){
		cout<<a[i]+tol<<endl;
	}
}





#include <bits/stdc++.h>
#include <vector>
# include <cstdint>
#define FOR(i,l,r) for(int i=(l);i<(r);++i)
#define RFOR(i,l,r) for(int i=(l);i>=(int)(r);i--)
#define rep(i,n)  FOR(i,0,n)
#define rrep(i,n)  RFOR(i,n-1,0)

#define int long long
using namespace std;
const int MX = 1e6;
const int inf = 1e13;
const int mod = 1e9+7;
#define ll long long
struct UnionFind {
    vector<int> d;
    UnionFind(int n): d(n, -1) {}
    int root(int x) {
        if(d[x] < 0) return x;
        return d[x] = root(d[x]);
    }
    bool unite(int x, int y) {
        x = root(x); y = root(y);
        if(x == y) return false;
        if(d[x] > d[y]) swap(x, y);
        d[x] += d[y];
        d[y] = x;
        return true;
    }
    bool same(int x, int y) {return (root(x) == root(y));}
    int size(int x) {return -d[root(x)];}
};
signed main() {
    int n,q;
    cin>>n>>q;
    vector<int> c(n);
    rep(i,n)cin>>c[i];
    UnionFind uf(n);
    vector<map<int,int> > mps(n);
    rep(i,n) {
        mps[i][c[i]]=1;
    }
    rep(i,q) {
        int x,a,b;
        cin>>x>>a>>b;
        if(x==1) {
            a--; b--;
            if(uf.same(a,b)) continue;
            // if(mps[uf.root(a)].size()<=mps[uf.root(b)].size()) {
            //     for(auto key:mps[uf.root(a)]) {
            //         mps[uf.root(b)][key.first]+=key.second;
            //     }
            //     mps[uf.root(a)]=mps[uf.root(b)];
            // }else {
            //     for(auto key:mps[uf.root(b)]) {
            //         mps[uf.root(a)][key.first]+=key.second;
            //     }
            //     mps[uf.root(b)]=mps[uf.root(a)];
            // }
            if(uf.size(uf.root(b))>uf.size(uf.root(a))) swap(a,b);
            for(auto key:mps[uf.root(b)]) {
                mps[uf.root(a)][key.first]+=key.second;
            }
            uf.unite(uf.root(a),uf.root(b));
        }else {
            a--;
            cout<< mps[uf.root(a)][b] <<endl;
        }
    }
    return 0;
}
