#include<bits/stdc++.h>
using namespace std;
#define int long long
struct xx{
int x,y,nxt;
}e[1000001];
int f[1000001][2];
const int inf=0x3f3f3f3f3f3f3f3f;
struct matr{
int a[3][3];
matr(){
memset(a,~0x3f,sizeof(a));
}
friend matr operator *(matr a,matr b){
matr c;
memset(c.a,0,sizeof(c.a));
for(int i=1;i<=2;i++){
for(int j=1;j<=2;j++){
for(int k=1;k<=2;k++){
c.a[i][j]=max(c.a[i][j],a.a[i][k]+b.a[k][j]);
}
}
}
return c;
}
void print(){
putchar('\n');
for(int i=1;i<=2;i++,putchar('\n'))
for(int j=1;j<=2;j++)printf("%d ",a[i][j]);
putchar('\n');
}
}tree[1000001],v[1000001];
struct tre{
int siz,son,ed,fa,top,a,dfn;
}a[1000001];
int head[1000001],cnt,n,m;
int ct=0,idfn[1000001];
void add(int a,int b){
e[++cnt].x=a;
e[cnt].y=b;
e[cnt].nxt=head[a];
head[a]=cnt;
}
void pushup(int rt){
tree[rt]=tree[rt<<1]*tree[rt<<1|1];
}
void build(int rt,int l,int r){
if(l==r){
tree[rt]=v[idfn[l]];
return;
}
int mid=l+r>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
pushup(rt);
}
void update(int rt,int l,int r,int x){
if(l==r){
tree[rt]=v[idfn[x]];
return ;
}
int mid=l+r>>1;
if(mid>=x)update(rt<<1,l,mid,x);
else update(rt<<1|1,mid+1,r,x);
pushup(rt);
}
matr query(int rt,int l,int r,int x,int y){
if(x<=l&&r<=y){
return tree[rt];
}
int mid=l+r>>1;
if (x>mid)return query(rt<<1|1,mid+1,r,x,y);
if (y<=mid)return query(rt<<1,l,mid,x,y);
return query(rt<<1,l,mid,x,y)*query(rt<<1|1,mid+1,r,x,y);
}
void modify(int x,int y){
v[x].a[2][1]+=y-a[x].a;
a[x].a=y;
matr lst,nxt;
while(x){
lst=query(1,1,n,a[a[x].top].dfn,a[a[x].top].ed);
update(1,1,n,a[x].dfn);
nxt=query(1,1,n,a[a[x].top].dfn,a[a[x].top].ed);
x=a[a[x].top].fa;
v[x].a[1][1]+=max(nxt.a[1][1],nxt.a[2][1])-max(lst.a[2][1],lst.a[1][1]);
v[x].a[1][2]=v[x].a[1][1];
v[x].a[2][1]+=nxt.a[1][1]-lst.a[1][1];
}
}
void dfs1(int x,int fa){
a[x].siz=1;a[x].fa=fa;
for(int i=head[x];i;i=e[i].nxt){
int y=e[i].y;
if(y==fa)continue;
dfs1(y,x);
a[x].siz+=a[y].siz;
if(a[y].siz>a[a[x].son].siz)a[x].son=y;
}
}
void dfs2(int x,int top){
a[x].top=top;
a[x].dfn=++ct;
idfn[ct]=x;
a[top].ed=max(a[top].ed,ct);
f[x][0]=0;f[x][1]=a[x].a;
v[x].a[1][1]=v[x].a[1][2]=0;
v[x].a[2][1]=a[x].a;v[x].a[2][2]=-inf;
if(a[x].son){
dfs2(a[x].son,top);
f[x][0]+=max(f[a[x].son][1],f[a[x].son][0]);
f[x][1]+=f[a[x].son][0];
}
for(int i=head[x];i;i=e[i].nxt){
int y=e[i].y;
if(y==a[x].fa||y==a[x].son)continue;
dfs2(y,y);
f[x][0]+=max(f[y][0],f[y][0]);
f[x][1]+=f[y][0];
v[x].a[1][1]+=max(f[y][0],f[y][1]);
v[x].a[1][2]=v[x].a[1][1];
v[x].a[2][1]+=f[y][0];
}
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",&a[i].a);
for(int i=1;i<n;i++){
int x,y;
scanf("%lld%lld",&x,&y);
add(x,y);add(y,x);
}
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
while(m--){
int x,y;
scanf("%lld%lld",&x,&y);
modify(x,y);
matr ans=query(1,1,n,a[1].dfn,a[1].ed);
printf("%lld\n",max(ans.a[1][1],ans.a[2][1]));
}
}