#include<bits/stdc++.h>
using namespace std;
typedef long long int lli;
typedef long double ld;
/*
#include <chrono> 
using namespace std::chrono;
#include <boost/multiprecision/cpp_int.hpp> 
using namespace boost::multiprecision;
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 
using namespace __gnu_pbds; 
#define ordered_set tree<lli, null_type,less_equal<lli>, rb_tree_tag,tree_order_statistics_node_update> 
//remove _equal from less_equal to make it ordered set , currently it is ordered_multiset
*/
#define pb push_back
const lli mod=1e9+7;
const lli mod1=998244353;
#define fir first
#define sec second
#define plli pair<lli,lli>
#define pplli pair<lli,plli>
/*
lli power(lli a, lli b) {
    lli res = 1;
    while (b > 0) {
        if (b & 1)
            res = res * a;
        a = a * a;
        b >>= 1;
    }
    return res;
}
lli powermod(lli a, lli b) 
{
    lli res = 1;
    while (b > 0) {
        if (b & 1)
            res = ((res%mod)*(a%mod))%mod;
        a = (a * a)%mod;
        b >>= 1;
    }
    return res%mod;
}
*/
const lli N=200001;
vector<lli> v[N];
lli timer=1;
lli sub[N],a[N],in[N],val[N];
vector<lli> flat;
lli st[4*N],lazy[4*N];
 
lli dfs(lli node,lli par,lli x=0)
{
    in[node]=timer;
    timer++;
    flat.pb(node);
    sub[node]=1;
    val[node]=x+a[node];
    for(lli child:v[node])
    {
        if(child!=par)
        {
            dfs(child,node,x+a[node]);
            sub[node]+=sub[child];
        }
    }
    return 0;
}
 
lli build(lli ss,lli se,lli z)
{
    if(ss==se)
    {
        st[z]=val[flat[ss]];
        return 0;
    }
    lli mid=(ss+se)/2;
    build(ss,mid,z*2);
    build(mid+1,se,(z*2)+1);
    st[z]=st[z*2]+st[z*2+1];
    return 0;
}
 
void push(lli z)
{
    st[z*2]+=lazy[z];
    lazy[z*2]+=lazy[z];
    st[z*2+1]+=lazy[z];
    lazy[z*2+1]+=lazy[z];
    lazy[z]=0;
}
 
lli update(lli ss,lli se,lli z,lli qs,lli qe,lli add)
{
    if((ss>qe)||(se<qs))
        return 0;
    if((ss>=qs)and(se<=qe))
    {
        st[z]+=add;
        lazy[z]+=add;
        return 0;
    }
    push(z);
    lli mid=(ss+se)/2;
    update(ss,mid,z*2,qs,qe,add);
    update(mid+1,se,z*2+1,qs,qe,add);
    st[z]=st[z*2]+st[z*2+1];
    return 0;
}
 
lli query(lli ss,lli se,lli z,lli qs)
{
    if(ss==se)
        return st[z];
    lli mid=(ss+se)/2;
    push(z);
    if(qs<=mid)
        return query(ss,mid,z*2,qs);
    else
        return query(mid+1,se,z*2+1,qs);
}
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    lli T,i,j;
    T=1;
    while(T--)
    {
        flat.pb(0);
        lli n,q,x,y;
        cin>>n>>q;
        for(i=1;i<=n;i++)
            cin>>a[i];
        for(i=0;i<n-1;i++)
        {
            cin>>x>>y;
            v[x].pb(y);
            v[y].pb(x);
        }
        dfs(1,0);
        build(1,n,1);
        while(q--)
        {
            lli r,s;
            cin>>r;
            if(r==1)
            {
                cin>>s>>x;
                update(1,n,1,in[s],in[s]+sub[s]-1,x-a[s]);
                a[s]=x;
            }
            else if(r==2)
            {
                cin>>s;
                cout<<query(1,n,1,in[s])<<"\n";
            }
        }
    }
    return 0;
}
 
 
 