Link to this code: https://cses.fi/paste/c215805f74fc338121e729/
#include<bits/stdc++.h>
#define REP(i,n) for (int i = 1; i <= n; i++)
#define mod 1000000007
#define pb push_back
#define ff first
#define ss second
#define ii pair<int,int>
#define vi vector<int>
#define vii vector<ii>
#define lli long long int
#define INF 1000000000
#define endl '\n'
const double PI = 3.141592653589793238460;
typedef std::complex<double> Complex;
typedef std::valarray<Complex> CArray;
using namespace std;

const int N = 200001;
vi tree[N];

lli ar[N];
lli temp[N];

lli st[2*N];

lli sub[N];
lli in[N];
int _timer = 0;

void dfs(int node, int par)
{
	sub[node] = 1;
	in[node] = ++_timer;
	ar[in[node]] = temp[node];
	
	for(int child : tree[node])
	if(child != par)
	dfs(child , node) , sub[node] += sub[child];
}

void build(int si , int ss , int se)
{
	
	if(ss == se){
		st[si] = ar[ss];
		return;
	}
	
	int mid = (ss + se) >> 1;
	build(2*si , ss , mid);
	build(2*si + 1 , mid+1 , se);
	
	st[si] = st[2*si] + st[2*si + 1];
}

void update(int si , int ss , int se , int qi , lli dx)
{
	if(ss > qi || se < qi) return;
	
	if(ss == se)
	{
		st[si] += dx;
		return;
	}
	
	int mid = (ss + se) >> 1;
	update(2*si , ss , mid , qi , dx);
	update(2*si + 1 , mid+1 , se , qi , dx);
	
	st[si] = st[2*si] + st[2*si + 1];
}

lli getSum(int si , int ss , int se , int qs , int qe)
{
	if(ss > qe || se < qs) return 0;
	
	if(ss >= qs && se <= qe)
	return st[si];
	
	int mid = (ss + se) >> 1;
	lli L = getSum(2*si , ss , mid , qs , qe);
	lli R = getSum(2*si + 1 , mid+1 , se , qs , qe);
	
	return L + R;
}

int main()
{
	int n , q , a , b , code;
	cin>>n>>q;
	
	REP(i , n) cin>>temp[i];
	REP(i , n-1) cin>>a>>b , tree[a].pb(b) , tree[b].pb(a);
	
	dfs(1 , -1);
	build(1 , 1 , n);
	
	while(q--)
	{
		cin>>code;
		
		if(code == 1) {
			cin>>a>>b;
			update(1 , 1 , n , in[a] , b - ar[in[a]]);
			ar[in[a]] = b;
		}
		else{
			cin>>a;
			cout<<getSum(1 , 1 , n , in[a] , in[a] + sub[a] - 1)<<endl;
		}
	}
}