#include<bits/stdc++.h>
#define int long long
using namespace std;
#define fi first
#define sc second
#define pii pair<int,int>
#define pb push_back
const int maxn=1e5+10;
const int inf=1e9;
int n,m,w[maxn],sz[maxn],son[maxn],tp[maxn],ed[maxn],dfn[maxn],dep[maxn],cnt,dp[maxn][2],f[maxn];
vector<int> g[maxn];
struct mat{
int n,a[3][3];
void init(int x){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) a[i][j]=x;
}
}
void getI(){
init(-inf);
for(int i=1;i<=n;i++) a[i][i]=0;
}
mat operator *(mat x){
mat ans;
ans.n=n,ans.init(-inf);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
ans.a[i][j]=max(ans.a[i][j],a[i][k]+x.a[k][j]);
}
}
}
return ans;
}
void output(){
cout<<"----MATRIXS----"<<endl;
for(int i=1;i<=n;i++,cout<<endl){
for(int j=1;j<=n;j++) cout<<a[i][j]<<" ";
}
cout<<"------END------"<<endl;
}
}val[maxn],I;
struct node{
int l,r;
mat s;
}tr[maxn*4];
int ls(int u){
return (u<<1);
}
int rs(int u){
return (u<<1)|1;
}
bool ir(int L,int R,int l,int r){
return (L<=l)&&(r<=R);
}
bool ofr(int L,int R,int l,int r){
return (R<l)||(r<L);
}
void dfs1(int u,int fa){
sz[u]=1,dep[u]=dep[fa]+1,dp[u][1]=w[u],f[u]=fa;
for(int v:g[u]){
if(v!=fa){
dfs1(v,u),sz[u]+=sz[v];
if(sz[v]>sz[son[u]]) son[u]=v;
dp[u][0]+=max(dp[v][0],dp[v][1]);
dp[u][1]+=dp[v][0];
}
}
}
void dfs2(int u,int fa,int top){
tp[u]=top,dfn[u]=++cnt,val[dfn[u]].n=2;
if(son[u]) dfs2(son[u],u,top);
val[dfn[u]].a[2][2]=-inf,val[dfn[u]].a[1][2]=w[u];
for(int v:g[u]){
if(v!=fa&&v!=son[u]){
dfs2(v,u,v);
val[dfn[u]].a[1][1]+=max(dp[v][0],dp[v][1]);
val[dfn[u]].a[2][1]+=max(dp[v][0],dp[v][1]);
val[dfn[u]].a[1][2]+=dp[v][0];
}
}
if(!son[u]) ed[u]=u;
else ed[u]=ed[son[u]];
}
void pushup(int u){
if(tr[u].l==tr[u].r) return ;
tr[u].s=tr[ls(u)].s*tr[rs(u)].s;
}
void build(int u,int l,int r){
tr[u].l=l,tr[u].r=r;
if(l==r) return tr[u].s=val[l],void();
int mid=(l+r)>>1;
build(ls(u),l,mid),build(rs(u),mid+1,r),pushup(u);
}
void upd(int u,int x,mat k){
if(tr[u].l==tr[u].r) return tr[u].s=k,void();
int mid=(tr[u].l+tr[u].r)>>1;
if(x<=mid) upd(ls(u),x,k);
else upd(rs(u),x,k);
pushup(u);
}
mat query(int u,int l,int r){
if(ir(l,r,tr[u].l,tr[u].r)) return tr[u].s;
else if(!ofr(l,r,tr[u].l,tr[u].r)) return query(ls(u),l,r)*query(rs(u),l,r);
else return I;
}
void cover(int u,int k){
val[dfn[u]].a[1][2]-=w[u],w[u]=k,val[dfn[u]].a[1][2]+=w[u];
while(u){
mat m1=query(1,dfn[tp[u]],dfn[ed[u]]),m2;
upd(1,dfn[u],val[dfn[u]]),m2=query(1,dfn[tp[u]],dfn[ed[u]]);
u=f[tp[u]];
val[dfn[u]].a[1][1]-=max(m1.a[1][1],m1.a[1][2]);
val[dfn[u]].a[1][1]+=max(m2.a[1][1],m2.a[1][2]);
val[dfn[u]].a[2][1]=val[dfn[u]].a[1][1];
val[dfn[u]].a[1][2]-=m1.a[1][1];
val[dfn[u]].a[1][2]+=m2.a[1][1];
}
}
void solve(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>w[i],w[i]=max(w[i],0ll);
for(int i=1,u,v;i<n;i++) cin>>u>>v,g[u].pb(v),g[v].pb(u);
dfs1(1,0),dfs2(1,0,1),build(1,1,n);
while(m--){
int x,y;
cin>>x>>y;
cover(x,max(y,0ll));
mat res=query(1,1,dfn[ed[1]]);
cout<<max(res.a[1][1],res.a[1][2])<<endl;
}
}
signed main(){
freopen("P4719_4.in","r",stdin);
freopen("out.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int t=1;
I.n=2,I.getI();
while(t--) solve();
return 0;
}