Iahub likes trees very much. Recently he discovered an interesting tree named propagating tree. The tree consists of *n* nodes numbered from 1 to *n*, each node *i* having an initial value *a*<sub class="lower-index">*i*</sub>. The root of the tree is node 1.

This tree has a special property: when a value *val* is added to a value of node *i*, the value -*val* is added to values of all the children of node *i*. Note that when you add value -*val* to a child of node *i*, you also add -(-*val*) to all children of the child of node *i* and so on. Look an example explanation to understand better how it works.

This tree supports two types of queries:
 -  "1 *x* *val*" — *val* is added to the value of node *x*; -  "2 *x*" — print the current value of node *x*. 
In order to help Iahub understand the tree better, you must answer *m* queries of the preceding type.
The first line contains two integers *n* and *m* (1 ≤ *n*, *m* ≤ 200000). The second line contains *n* integers *a*<sub class="lower-index">1</sub>, *a*<sub class="lower-index">2</sub>, ..., *a*<sub class="lower-index">*n*</sub> (1 ≤ *a*<sub class="lower-index">*i*</sub> ≤ 1000). Each of the next *n*–1 lines contains two integers *v*<sub class="lower-index">*i*</sub> and *u*<sub class="lower-index">*i*</sub> (1 ≤ *v*<sub class="lower-index">*i*</sub>, *u*<sub class="lower-index">*i*</sub> ≤ *n*), meaning that there is an edge between nodes *v*<sub class="lower-index">*i*</sub> and *u*<sub class="lower-index">*i*</sub>.

Each of the next *m* lines contains a query in the format described above. It is guaranteed that the following constraints hold for all queries: 1 ≤ *x* ≤ *n*, 1 ≤ *val* ≤ 1000.
#include<bits/stdc++.h>
using namespace std;
#define fl(i,a,n) for(int i=a;i<(n);++i)
#define rfl(i,a,n) for(int i=(n-1);i>a-1;i--)
#define rep(i,n) for(int i=1;i<=n;i++)
#define rrep(i,n) for(int i=n;i>0;i--)
#define srt(a,n) sort(a+1,a+n+1)
#define li long
#define ll long long
#define ull unsigned long long
#define clr(a) memset(a,0,sizeof(a))
#define vi vector <int>
#define vll vector <long long>
#define pii pair <int,int>
#define mod 1000000007
#define pb push_back
#define fr first
#define sc second
#define loop(i,n) for(int i=0;i<n;i++)
#define pi 3.1415926535
#define N 400005
int a[N],start[N],endt[N],level[N],bit[N];
vi graph[N];
int dfstime = 0;
void dfs(int x,int par)
{
	level[x] = level[par]^1;
	start[x] = ++dfstime;
	loop(i,graph[x].size())
	{
		if(graph[x][i]!=par)
		{
			dfs(graph[x][i],x);
		}
	}
	endt[x] = ++dfstime;
}
void add(int x,int val)
{
	for(;x<=dfstime;x+=x&(-x))
	{
		bit[x] += val;
	}
}
int presum(int x)
{
	int res = 0;
	while(x)
	{
		res+=bit[x];
		x-=x&(-x);
	}
	return res;
}
int main()
{
	#ifndef ONLINE_JUDGE
	freopen("input.txt","r",stdin);
	freopen("output.txt","w",stdout);
	#endif
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	int n,m;
	cin>>n>>m;
	rep(i,n)
	{
		cin>>a[i];
	}
	rep(i,n-1)
	{
		int x,y;
		cin>>x>>y;
		graph[x].push_back(y);
		graph[y].push_back(x);
	}
	dfs(1,0);
	// rep(i,n)
	// {
	// 	cout<<start[i]<<endt[i]<<endl;
	// }
	int q,x,val;
	rep(i,m)
	{
		cin>>q>>x;
		if(q==1)
		{
			cin>>val;
			if(level[x]) val*=-1;
			add(start[x],val);
			add(endt[x],-val);
		}
		else
		{
			if(level[x]) cout<<a[x] + presum(start[x])*-1;
			else cout<<a[x] + presum(start[x]);
			cout<<'\n';
		}
	}
	return 0;
}