#include<bits/stdc++.h>
using namespace std;
inline int read(){
int p=0, q=1;
char ch=getchar();
while (!isdigit(ch)) q=(ch=='-')?-1:1,ch=getchar();
while (isdigit(ch)) p=(p<<3)+(p<<1)+(ch^48),ch=getchar();
return p*q;
}
//--------------------------------------------------------------------
int n,Qu,a[1000005];
int dep[1000005],top[1000005],fa[1000005],sz[1000005];
int son[1000005],dfn[1000005],idx=0,tail[1000005];
vector<int>q[1000005];
inline int max(int a,int b){
return (a>b)?a:b;
}
struct Matrix{
int a[2][2];
inline Matrix(){a[0][0]=a[1][0]=a[0][1]=a[1][1]=0;}
inline Matrix operator*(const Matrix&b)const{
Matrix c;
c.a[0][0]=max(a[0][0]+b.a[0][0],a[0][1]+b.a[1][0]);
c.a[1][0]=max(a[1][0]+b.a[0][0],a[1][1]+b.a[1][0]);
c.a[0][1]=max(a[0][0]+b.a[0][1],a[0][1]+b.a[1][1]);
c.a[1][1]=max(a[1][0]+b.a[0][1],a[1][1]+b.a[1][1]);
return c;
}
}tree[3750005],s[1000005];
inline void dfs1(int now){
sz[now]=1;son[now]=0;
for(auto v:q[now])
if(!dep[v]){
dep[v]=dep[now]+1;
fa[v]=now;
dfs1(v);
sz[now]+=sz[v];
if(!son[now]||sz[son[now]]<sz[v])son[now]=v;
}
}
inline void dfs2(int now){
dfn[now]=++idx;
if(son[now]){
top[son[now]]=top[now];
dfs2(son[now]);
}
for(auto v:q[now])
if(v!=son[now]&&dep[v]>dep[now]){
top[v]=v;
dfs2(v);
}
tail[now]=(son[now])?tail[son[now]]:now;
}
Matrix query(int l,int r,int p,const int&L,const int&R){
if(L<=l&&r<=R)return tree[p];
int mid=(l+r)>>1;
if(L<=mid&&mid<R)
return query(mid+1,r,p<<1|1,L,R)*query(l,mid,p<<1,L,R);
else if(mid<R)
return query(mid+1,r,p<<1|1,L,R);
else if(L<=mid)
return query(l,mid,p<<1,L,R);
else return s[0];
}
inline void modify(int l,int r,int p,const int&pos,const Matrix&to){
if(l==r){
tree[p]=to;
return;
}
int mid=(l+r)>>1;
if(pos<=mid)
modify(l,mid,p<<1,pos,to);
else
modify(mid+1,r,p<<1|1,pos,to);
tree[p]=tree[p<<1|1]*tree[p<<1];
}
inline void calc(int now){
stack<int>Q;
for(int i=now;i;i=son[i])
Q.push(i);
while(!Q.empty()){
int u=Q.top();
Q.pop();
int x=0,y=a[u];
for(auto v:q[u])
if(dep[v]>dep[u]&&v!=son[u]){
calc(v);
Matrix gg=s[v];
x+=max(gg.a[0][0],gg.a[0][1]);
y+=gg.a[0][0];
}
Matrix gg;
gg.a[0][0]=gg.a[1][0]=x;
gg.a[0][1]=y;
modify(1,n,1,dfn[u],gg);
}
s[now]=query(1,n,1,dfn[now],dfn[tail[now]]);
}
inline void modify(int u,int val){
Matrix p=query(1,n,1,dfn[u],dfn[u]);
p.a[0][1]+=val-a[u];
modify(1,n,1,dfn[u],p);
a[u]=val;
for(int now=top[u];now!=1;now=top[now]){
int f=fa[now];
p=query(1,n,1,dfn[f],dfn[f]);
Matrix q=query(1,n,1,dfn[now],dfn[tail[now]]);
p.a[0][0]+=max(q.a[0][0],q.a[0][1])-max(s[now].a[0][0],s[now].a[0][1]);
p.a[0][1]+=q.a[0][0]-s[now].a[0][0];
p.a[1][0]=p.a[0][0];
modify(1,n,1,dfn[f],p);
s[now]=q;now=f;
}
}
int lastans;
signed main(){
n=read();
Qu=read();
for(int i=1;i<=n;++i)
a[i]=read();
for(int i=1,u,v;i<n;++i){
u=read(),v=read();
q[u].push_back(v);
q[v].push_back(u);
}
dep[1]=1;top[1]=1;
dfs1(1);dfs2(1);calc(1);
while(Qu--){
int x=read()^lastans,y=read();
modify(x,y);
Matrix p=query(1,n,1,1,dfn[tail[1]]);
printf("%d",max(p.a[0][0],p.a[0][1]));
puts("");
lastans=max(p.a[0][0],p.a[0][1]);
}
return 0;
}