#include<bits/stdc++.h>
using namespace std;
const int N=4e5+10;
typedef vector<int> vi;
#define pb push_back
typedef long long ll;
int gi() {
int x=0,o=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if(ch=='-') o=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*o;
}
struct dat { int t,u,o; };
int n,m,c[N],fa[N],sz[N],vsz[N],ch[N][2],pa[N];
ll sz2[N],vsz2[N],ans[N];
vi E[N];
vector<dat> eve[N];
void dfs(int u) {
for(auto v:E[u]) if(v^pa[u]) pa[v]=u,dfs(v);
}
ll sqr(int x) {
return 1ll*x*x;
}
void pushup(int x) {
sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+vsz[x]+1;
sz2[x]=vsz2[x]+sqr(sz[ch[x][0]])+sqr(sz[ch[x][1]]);
}
bool isroot(int x) {
return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;
}
void rotate(int x) {
int y=fa[x],z=fa[y],w=ch[y][1]==x;
if(!isroot(y)) ch[z][ch[z][1]==y]=x;
ch[y][w]=ch[x][w^1];fa[ch[y][w]]=y;
ch[x][w^1]=y;fa[y]=x;fa[x]=z;
pushup(y);pushup(x);
}
void splay(int x) {
while(!isroot(x)) {
int y=fa[x],z=fa[y];
if(!isroot(y)) (ch[y][0]==x)^(ch[z][0]==y)?rotate(x):rotate(y);
rotate(x);
}
}
void access(int x) {
for(int t=0;x;t=x,x=fa[x]) {
splay(x);
vsz[x]+=sz[ch[x][1]];vsz2[x]+=sqr(sz[ch[x][1]]);
ch[x][1]=t;
vsz[x]-=sz[t];vsz2[x]-=sqr(sz[t]);
pushup(x);
}
}
int findroot(int x) {
access(x);splay(x);while(ch[x][0]) x=ch[x][0]; splay(x); return x;
}
void link(int x,int ff) {
access(ff);splay(ff);splay(x);vsz[ff]+=sz[x];vsz2[ff]+=sqr(sz[x]);fa[x]=ff;pushup(ff);
}
void cut(int x,int ff) {
access(ff);splay(ff);splay(x);vsz[ff]-=sz[x];vsz2[ff]-=sqr(sz[x]);fa[x]=0;pushup(ff);
}
int main() {
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
cin>>n>>m;
for(int i=1;i<=n;i++) c[i]=gi();
for(int i=1,u,v;i<n;i++) u=gi(),v=gi(),E[u].pb(v),E[v].pb(u);
dfs(1),pa[1]=n+1;
for(int i=1;i<=n+1;i++) sz[i]=1;
for(int i=1;i<=n;i++) link(i,pa[i]);
for(int i=1;i<=n;i++) eve[c[i]].pb((dat){0,i,0});
for(int i=1;i<=m;i++) {
int u=gi(),x=gi();
eve[c[u]].pb((dat){i,u,1});
eve[c[u]=x].pb((dat){i,u,0});
}
for(int i=1;i<=n;i++) eve[c[i]].pb((dat){m+1,i,1});
for(int i=1;i<=n;i++)
for(auto x:eve[i]) {
int t=x.t,u=x.u,ff=findroot(pa[u]);
if(x.o) {
splay(ff),splay(u),ans[t]+=sz2[ff]+sz2[u];
link(u,pa[u]),splay(ff),ans[t]-=sz2[ff];
}
else {
splay(ff),ans[t]+=sz2[ff],cut(u,pa[u]);
splay(ff),splay(u),ans[t]-=sz2[ff]+sz2[u];
}
}
for(int i=1;i<=m;i++) ans[i]+=ans[i-1];
for(int i=0;i<=m;i++) cout<<ans[i]<<endl;
return 0;
}