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 ai. 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.

Input

The first line contains two integers n and m (1 ≤ n, m ≤ 200000). The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 1000). Each of the next n–1 lines contains two integers vi and ui (1 ≤ vi, ui ≤ n), meaning that there is an edge between nodes vi and ui.

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.

Output

For each query of type two (print the value of node x) you must print the answer to the query on a separate line. The queries must be answered in the order given in the input.

Examples

Input

5 5
1 2 1 1 2
1 2
1 3
2 4
2 5
1 2 3
1 1 2
2 1
2 2
2 4


Output

3
3
0

Note

The values of the nodes are [1, 2, 1, 1, 2] at the beginning.

Then value 3 is added to node 2. It propagates and value -3 is added to it's sons, node 4 and node 5. Then it cannot propagate any more. So the values of the nodes are [1, 5, 1, - 2, - 1].

Then value 2 is added to node 1. It propagates and value -2 is added to it's sons, node 2 and node 3. From node 2 it propagates again, adding value 2 to it's sons, node 4 and node 5. Node 3 has no sons, so it cannot propagate from there. The values of the nodes are [3, 3, - 1, 0, 1].

You can see all the definitions about the tree at the following link: http://en.wikipedia.org/wiki/Tree_(graph_theory)
import java.io.*;
import java.util.*;
import java.text.*;
import java.lang.*;
import java.math.*;

public class Main{
	static ArrayList a[] = new ArrayList [200001];
	static int start [] = new int [200001];
	static int end[] = new int [200001];
	static ArrayList[] b= new ArrayList [10];
	static int idx[] = new int [200001];
	static int val[] = new int [200001];
	static int level[] = new int [200001];
	static int cnt = 0;
	static void dfs(int n , int p) {
		start[n] = cnt ++;
		b[level[n] % 2 ] .add(val[n] * 1L);
		b[level[n] % 2 + 2].add(start[n]);
		idx[n] = b[level[n] % 2 ] .size() - 1;
		for(int i = 0 ; i <  a[n].size() ;i++) {
			int idx = (int)a[n].get(i);
			if(idx != p) {
				level[idx] = level[n] + 1;
				dfs(idx , n);
			}
		}
		end [n] = cnt - 1;
		
	}
	public void solve () throws IOException  {
       
    	InputReader in = new InputReader(System.in);
        PrintWriter pw = new PrintWriter(System.out);
        int n = in.nextInt();
        int q = in.nextInt();
        for(int i = 0 ; i <= n ; i++) {
        	a[i] = new ArrayList<Integer>();
        }
        for(int i = 0 ; i < 10 ; i++) {
        	b[i] = new  ArrayList<Long>();
        }
        for(int i = 1 ; i <= n ; i++)
        	val[i] = in.nextInt();
        
        
        for(int i = 0 ; i < n - 1; i++) {
        	int x = in.nextInt();
        	int y = in.nextInt();
        	a[x].add(y);
        	a[y].add(x);
        }
        dfs(1 , 0);
        Segment s[] = new Segment[2];
        for(int i = 0 ; i < 2 ; i++) {
            s[i] = new Segment (b[i].size() , b[i]);
            s[i].build(0, 0, b[i].size() - 1);
        }
        
        while(q -- > 0) {
        	int t = in.nextInt();
        	if(t == 1) {
        		int idx = in.nextInt();
        		long val = in.nextLong();
        		for(int i = 2 ; i < 4 ; i++) {
        			int l = lb(start[idx] , b[i]);
        			int r = ub(end[idx] , b[i]);
        			if(l <= r) {
        				s[i % 2].updateRange(0, 0, b[i % 2].size() - 1, l, r, (level[idx] % 2 == i % 2)? val : -1*val);
        			}
        		}
        	}
        	else {
        		int id = in.nextInt();
        		int l = level[id] % 2;
        		long val = s[l].queryRange(0, 0, b[l].size() - 1, idx[id], idx[id]);
        		pw.println(val);
        	}
        }
        pw.flush(); 
        pw.close();
    }
    public static void main(String[] args) throws Exception {
        
        
        new Thread(null,new Runnable() {
            public void run() {
                  try {
					new Main().solve();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
            }  
        },"1",1<<26).start();
        
        
    }
    static int lb (int val , ArrayList a) {
    	int start = 0;
    	int end = a.size() - 1;
    	int ans = a.size();
    	while(start <= end) {
    		int mid = (start + end)/2;
    		int can = (int) a.get(mid);
    		if(can >= val) {
    			ans  = mid ;
    			end = mid - 1;
    		}
    		else
    			start = mid + 1;
    	}
    	return ans;
    }
    static int ub (int val , ArrayList a) {
    	int start = 0;
    	int end = a.size() - 1;
    	int ans = -1;
    	while(start <= end) {
    		int mid = (start + end)/2;
    		int can = (int) a.get(mid);
    		if(can <= val) {
    			ans  = mid ;
    			start = mid + 1;
    		}
    		else
    			end = mid - 1;
    	}
    	return ans;
    }
    static void debug(Object... o) {
        System.out.println(Arrays.deepToString(o));
        }
        
        static class InputReader 
        {
        private final InputStream stream;
        private final byte[] buf = new byte[8192];
        private int curChar, snumChars;
        private SpaceCharFilter filter;
 
        public InputReader(InputStream stream) 
        {
            this.stream = stream;
        }
        public int snext() 
        {
            if (snumChars == -1)
                throw new InputMismatchException();
            if (curChar >= snumChars) 
            {
                curChar = 0;
                try 
                {
                    snumChars = stream.read(buf);
                } 
                catch (IOException e) 
                {
                    throw new InputMismatchException();
                }
                if (snumChars <= 0)
                    return -1;
            }
            return buf[curChar++];
        }
 
        public int nextInt() 
        {
            int c = snext();
            while (isSpaceChar(c)) 
            {
                c = snext();
            }
            int sgn = 1;
            if (c == '-')
            {
                sgn = -1;
                c = snext();
            }
            int res = 0;
            do 
            {
                if (c < '0' || c > '9')
                    throw new InputMismatchException();
                res *= 10;
                res += c - '0';
                c = snext();
            } while (!isSpaceChar(c));
            return res * sgn;
        }
 
        public long nextLong()
        {
            int c = snext();
            while (isSpaceChar(c)) 
            {
                c = snext();
            }
            int sgn = 1;
            if (c == '-') 
            {
                sgn = -1;
                c = snext();
            }
            long res = 0;
            do 
            {
                if (c < '0' || c > '9')
                    throw new InputMismatchException();
                res *= 10;
                res += c - '0';
                c = snext();
            } while (!isSpaceChar(c));
            return res * sgn;
        }
 
        public int[] nextIntArray(int n) 
        {
            int a[] = new int[n];
            for (int i = 0; i < n; i++) 
            {
                a[i] = nextInt();
            }
            return a;
        }
 
        public String readString()
        {
            int c = snext();
            while (isSpaceChar(c)) 
            {
                c = snext();
            }
            StringBuilder res = new StringBuilder();
            do 
            {
                res.appendCodePoint(c);
                c = snext();
            } while (!isSpaceChar(c));
            return res.toString();
        }
 
        public String nextLine() 
        {
            int c = snext();
            while (isSpaceChar(c))
                c = snext();
            StringBuilder res = new StringBuilder();
            do 
            {
                res.appendCodePoint(c);
                c = snext();
            } while (!isEndOfLine(c));
            return res.toString();
        }
 
        public boolean isSpaceChar(int c) 
        {
            if (filter != null)
                return filter.isSpaceChar(c);
            return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
        }
 
        private boolean isEndOfLine(int c) 
        {
            return c == '\n' || c == '\r' || c == -1;
        }
 
        public interface SpaceCharFilter
        {
            public boolean isSpaceChar(int ch);
        }
    }
        public static long mod = 1000000007;
        public static int d;
        public static int p;
        public static int q;
        public void extended(int a,int b) {
            if(b==0) {
                d=a;
                p=1;
                q=0;
            }
            else
            {
                extended(b,a%b);
                int temp=p;
                p=q;
                q=temp-(a/b)*q;
            }
        }
       
        
        public static long binaryExponentiation(long x,long n)
        {
            long result=1;
            while(n>0)
            {
                if(n % 2 ==1)
                    result=result * x;
                x=x*x;
                n=n/2;
            }
            return result;
        }
        
        public static long[] shuffle(long[] a,Random gen)
        {
            int n = a.length;
            for(int i=0;i<n;i++)
            {
                int ind = gen.nextInt(n-i)+i;
                long temp = a[ind];
                a[ind] = a[i];
                a[i] = temp;
            }
            return a;
        }
        
        public static void swap(int a, int b){
            int temp = a;
            a = b;
            b = temp;
        }
        
        public static HashSet<Integer> primeFactorization(int n)
        {
            HashSet<Integer> a =new HashSet<Integer>();
            for(int i=2;i*i<=n;i++)
            {
                while(n%i==0)
                {
                    a.add(i);
                    n/=i;
                }
            }
            if(n!=1)
                a.add(n);
            return a;
        }
        
        public static void sieve(boolean[] isPrime,int n)
        {
            for(int i=1;i<n;i++)
                isPrime[i] = true;
            
            isPrime[0] = false;
            isPrime[1] = false;
            
            for(int i=2;i*i<n;i++)
            {
                if(isPrime[i] == true)
                {
                    for(int j=(2*i);j<n;j+=i)
                        isPrime[j] = false;
                }
            }
        }
        
        public static long GCD(long n,long m)
        {
            if(m==0)
                return n;
            else
                return GCD(m,n%m);
        }
        public static long LCM (long a,long b) {
            return ((a*b)/(GCD(a,b)));
        }
        
        static class pair implements Comparable<pair>
        {
            Integer x , y ;
            
            pair(int l, int w )
            {
                this.x=l;
                this.y=w;
            }

           
            public int compareTo(pair o) {
                int result = x.compareTo(o.x);
                if(result==0)
                    result = y.compareTo(o.y);
                
                return result;
            }  
            
            public String toString()
            {
                return x+" "+y;
            }
            
            public boolean equals(Object o)
            {
                if (o instanceof pair)
                {
                    pair p = (pair)o;
                    return p.x == x && p.y == y ;
                }
                return false;
            }
            public int hashCode()
            {
                return x.hashCode()*3 +  y.hashCode();
                
            }
        }
        public static int binaryExponentiation(int x,int n)
        {
            int result=1;
            while(n>0)
            {
                if(n % 2 ==1)
                    result=result * x;
                x=x*x;
                n=n/2;
            }
            return result;
        }
        
       
        
        public static int modularExponentiation(int x,int n,int M)
        {
            int result=1;
            while(n>0)
            {
                if(n % 2 ==1)
                    result=(result * x)%M;
                x=(x%M*x)%M;
                n=n/2;
            }
            return result;
        }
        
        public static long modularExponentiation(long x,long n,long M)
        {
            long result=1;
            while(n>0)
            {
                if(n % 2 ==1)
                    result=(result%M * x%M)%M;
                x=(x%M * x%M)%M;
                n=n/2;
            }
            return result;
        }
        
        public static long modInverse(int A,int M)
        {
            return modularExponentiation(A,M-2,M);
        }
        
        public static long modInverse(long A,long M)
        {
            return modularExponentiation(A,M-2,M);
        }
        
       
        
                    
         
}

class Segment{ 
	long seg[]; 
	long a [];
	long lazy[];
    Segment (int n, ArrayList<Long> b){
		seg=new long[4*n];
		lazy=new long[4*n];
		a = new long [n + 5];
		for(int i = 0 ;i < b.size() ; i++) {
			a[i] = b.get(i);
		}
	}
    public void build(int node,int start,int end) {
    	if(start > end) return ;
    	if(start==end) {
    		seg[node] = a[start];
    		return ;
    	}
    	int mid=(start+end)/2;
    	build(2*node+1,start,mid);
    	build(2*node+2,mid+1,end);
    }
    
    public void updateRange(int node,int start,int end,int l,int r,long val) {
    	if(lazy[node]!=0) {
    		seg[node] += lazy[node];
    		if(start!=end) {
    			lazy[2*node+1]+=lazy[node];
    			lazy[2*node+2]+=lazy[node];
    		}
    		lazy[node]=0L;
    	}
    	if(l>end || r<start)
    		return ;
    	if(start>=l && end<=r) {
    		seg[node] += val;
    		if(start!=end) {
    			lazy[2*node+1]+=val;
    			lazy[2*node+2]+=val;
    		}
    		lazy[node]=0;
    		return ;
    	}
    	int mid=(start+end)/2;
    	updateRange(2*node+1,start,mid,l,r,val);
    	updateRange(2*node+2,mid+1,end,l,r,val);
    }
    public long queryRange(int node,int start,int end,int l,int r) {
    	if(l>end || r<start)
    		return 0;
    	if(lazy[node]!=0) {
    		seg[node] += lazy[node];
    		if(start!=end) {
    			lazy[2*node+1]+=lazy[node];
    			lazy[2*node+2]+=lazy[node];
    		}
    		lazy[node]=0;
    	}
    	if(start>=l && end<=r)
    		return seg[node];
    	
    	int  mid=(start+end)/2;
    	return (queryRange(2*node+1,start,mid,l,r)+queryRange(2*node+2,mid+1,end,l,r));
    }
    
}