// ROOT : DRAGON3012009 : WA in Real Life
#include <bits/stdc++.h>
#define FOR(i,l,r) for(int i = l ; i <= r ; i ++)
#define FORD(i,r,l) for(int i = r ; i >= l ; i --)
#define REP(i, a ) for(int i = 0 ; i < a ; i ++ )
#define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end());
#define ll long long
#define el "\n"
#define fi first
#define se second
#define _ROOT_ int main()
#define M 1000000007
#define MAXN 300103
#define Bit(i) (1LL << i )
#define INF (1ll<<30)
#define NAME "file"
#define debug(a) cout << #a << " = " << a << endl;
using namespace std;

ll n, m, q ;
ll a[MAXN] ;
ll st[MAXN], fin[MAXN ], timeDfs ;
ll h[MAXN ] ;
ll par[MAXN] ;
vector<ll> high[MAXN ] ;
vector<ll> adj[MAXN] ;

struct Seg {
    vector<ll> lazy, val ;

    void addd(ll sz ) {
        lazy.resize(4 * sz , 0 ) ;
        val.resize(4 * sz , 0 ) ;
    }
    void fix(ll id, ll l, ll r ) {
        if(lazy[id] == 0 ) return ;
        val[id] += lazy[id] * (r - l + 1 ) ;
        if(l != r ) {
            lazy[id << 1 ] += lazy[id] ;
            lazy[id << 1 | 1] += lazy[id] ;
        }
        lazy[id ] = 0 ;
    }

    void update(ll id, ll l, ll r, ll u, ll v, ll value ) {
        fix(id, l, r ) ;
        if(u > r || v < l ) return ;
        if(u <= l && v >= r ) {
            lazy[id] += value ;
            fix(id, l, r) ;
            return ;
        }
        ll m = l + r >> 1 ;
        update(id << 1, l, m, u, v, value ) ;
        update(id << 1 | 1, m + 1, r, u, v, value ) ;
        val[id] = val[id << 1] + val[id << 1 | 1 ] ;
    }
    ll get(ll id, ll l, ll r, ll u, ll v ) {
        fix(id, l, r ) ;
        if(u > r || v < l ) return 0 ;
        if(u <= l && v >= r ) return val[id] ;
        ll m = l + r >> 1 ;
        return get(id << 1, l, m, u, v ) + get(id << 1 | 1, m + 1, r, u, v ) ;
    }
} seg[MAXN ] ;

void dfs(ll u, ll p ) {
    st[u] = ++ timeDfs ;
    for(ll v : adj[u]) if(v != p ) {
            par[v] = u ;
            h[v] = h[u] + 1;
            dfs(v, u ) ;
        }
    fin[u] = timeDfs ;
}

void init() {
    cin >> n >> q ;
    FOR(i, 1, n ) cin >> a[i] ;
    FOR(i, 2, n ) {
        ll x, y ;
        cin >> x >> y ;
        adj[x].push_back(y) ;
        adj[y].push_back(x) ;
    }
}

void solve() {
    dfs(1 , 1 ) ;

    FOR(i, 1, n ) high[h[i]].push_back(st[i]) ;
    FOR(i, 0, n ) sort(high[i].begin(), high[i].end() ) ;
    FOR(i, 0, n + 1  ) seg[i].addd(high[i].size() + 1 ) ;

    FOR(i, 1, n ) {
        ll L = lower_bound(high[h[i]].begin(), high[h[i]].end(), st[i]) - high[h[i]].begin() ;
        seg[h[i]].update(1, 0, high[h[i]].size(), L, L, a[i]) ;
    }

    FOR(cnt, 1, q ) {
        ll t ;
        cin >> t ;
        if(t == 1 ) {
            ll u, value ;
            cin >> u >> value ;
            ll nxt_high = h[u] + 1 ;

            ll L = lower_bound(high[h[u]].begin(), high[h[u]].end(), st[u]) - high[h[u]].begin() ;
            seg[h[u]].update(1, 0, high[h[u]].size(), L, L, 2 * value  ) ;

            if(par[u]) {
                L = lower_bound(high[h[u] - 1 ].begin(), high[h[u] - 1 ].end(), st[par[u]] ) - high[h[u] - 1 ].begin() ;
                seg[h[u] - 1 ].update(1, 0, high[h[u] - 1].size(), L, L,  value  ) ;
            }

            L = lower_bound(high[nxt_high].begin(), high[nxt_high].end(), st[u] ) -  high[nxt_high].begin() ;
            ll R = upper_bound(high[nxt_high].begin(), high[nxt_high].end(), fin[u] ) - high[nxt_high].begin() - 1 ;
            if(L > R ) continue ;
            seg[nxt_high].update(1, 0, high[nxt_high].size(), L, R, value ) ;
        } else {
            ll u ;
            cin >> u ;
            ll ans = 0 ;
            ll nxt_high = h[u] + 1 ;

            ll L = lower_bound(high[h[u]].begin(), high[h[u]].end(), st[u]) - high[h[u]].begin() ;
            ans +=  seg[h[u]].get(1, 0, high[h[u]].size(), L, L   ) ;

            if(par[u]) {
                L = lower_bound(high[h[u] - 1 ].begin(), high[h[u] - 1 ].end(), st[par[u]] ) - high[h[u] - 1 ].begin() ;
                ans +=   seg[h[u] - 1 ].get(1, 0, high[h[u] - 1].size(), L, L ) ;
            }

            L = lower_bound(high[nxt_high].begin(), high[nxt_high].end(), st[u] ) -  high[nxt_high].begin() ;
            ll R = upper_bound(high[nxt_high].begin(), high[nxt_high].end(), fin[u] ) - high[nxt_high].begin() - 1 ;
            if(L <= R ) ans += seg[nxt_high].get(1, 0, high[nxt_high].size(), L, R ) ;

            cout << ans << el ;
        }
    }
}

_ROOT_ {
    // freopen(NAME".inp" , "r" , stdin);
    // freopen(NAME".out" , "w", stdout) ;
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1; // cin >> t ;
    while(t--) {
        init();
        solve();
    }
    return (0&0);
}
