#include <bits/stdc++.h>
using namespace std;
inline int gi() {
  char c;
  int num = 0, flg = 1;
  while ((c = getchar()) < '0' || c > '9')
    if (c == '-') flg = -1;
  while (c >= '0' && c <= '9') {
    num = num * 10 + c - 48;
    c = getchar();
  }
  return num * flg;
}
long long all;
namespace LCT {
int fa[400005], ch[400005][2], siz[400005], vsz[400005];
long long sum[400005];
long long val(int x) { return 1ll * siz[x] * siz[x]; }
bool pdc(int x) { return ch[fa[x]][1] == x; }
bool nrt(int x) { return ch[fa[x]][0] == x || ch[fa[x]][1] == x; }
void pushup(int x) { siz[x] = siz[ch[x][0]] + siz[ch[x][1]] + 1 + vsz[x]; }
void rot(int x) {
  int y = fa[x], z = fa[y];
  bool flg = pdc(x);
  if (nrt(y)) ch[z][pdc(y)] = x;
  if (ch[y][flg] = ch[x][flg ^ 1]) fa[ch[y][flg]] = y;
  ch[x][flg ^ 1] = y;
  fa[y] = x;
  fa[x] = z;
  pushup(y);
  pushup(x);
}
void splay(int x) {
  for (; nrt(x); rot(x))
    if (nrt(fa[x])) rot(pdc(x) == pdc(fa[x]) ? fa[x] : x);
}
void Access(int x) {
  for (int i = 0; x; i = x, x = fa[x]) {
    splay(x);
    vsz[x] -= siz[i];
    vsz[x] += siz[ch[x][1]];
    sum[x] -= val(i);
    sum[x] += val(ch[x][1]);
    ch[x][1] = i;
    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 y) {
  Access(x);
  all -= sum[x] + val(ch[x][1]);
  int z = findroot(y);
  all -= val(ch[z][1]);
  splay(y);
  fa[x] = y;
  vsz[y] += siz[x];
  sum[y] += val(x);
  pushup(y);
  Access(x);
  splay(z);
  all += val(ch[z][1]);
}
void cut(int x, int y) {
  Access(x);
  all += sum[x];
  int z = findroot(x);
  all -= val(ch[z][1]);
  splay(x);
  ch[x][0] = fa[ch[x][0]] = 0;
  pushup(x);
  splay(z);
  all += val(ch[z][1]);
}
}  // namespace LCT
int fir[400005], to[2 * 400005], nxt[2 * 400005], cnt;
void adde(int a, int b) {
  to[++cnt] = b;
  nxt[cnt] = fir[a];
  fir[a] = cnt;
  to[++cnt] = a;
  nxt[cnt] = fir[b];
  fir[b] = cnt;
}
int fa[400005];
void dfs(int u, int ff) {
  fa[u] = ff;
  for (int p = fir[u]; p; p = nxt[p])
    if (to[p] != ff) dfs(to[p], u);
}
vector<pair<int, int> > tmp[400005];
int col[400005];
bool oft[400005];
long long ans[400005];
int main() {
  int n, m, i, j, u, v, t;
  n = gi();
  m = gi();
  for (i = 1; i <= n; i++) {
    col[i] = gi();
    tmp[col[i]].push_back(make_pair(0, i));
  }
  for (i = 1; i < n; i++) {
    u = gi();
    v = gi();
    adde(u, v);
  }
  dfs(1, n + 1);
  for (i = 1; i <= m; i++) {
    u = gi();
    v = gi();
    tmp[col[u]].push_back(make_pair(i, u));
    col[u] = v;
    tmp[col[u]].push_back(make_pair(i, u));
  }
  for (i = 1; i <= n; i++) LCT::link(i, fa[i]);
  for (i = 1; i <= n; i++) {
    long long pre = 0;
    for (j = 0; j < int(tmp[i].size()); j++) {
      t = tmp[i][j].first;
      u = tmp[i][j].second;
      if (!oft[u])
        LCT::cut(u, fa[u]);
      else
        LCT::link(u, fa[u]);
      oft[u] ^= 1;
      ans[t] += 1ll * n * n - all - pre;
      pre = 1ll * n * n - all;
    }
    for (j = 0; j < int(tmp[i].size()); j++)
      if (oft[u = tmp[i][j].second]) LCT::link(u, fa[u]), oft[u] = 0;
  }
  for (i = 1; i <= m; i++) ans[i] += ans[i - 1];
  for (i = 0; i <= m; i++) printf("%lld\n", ans[i]);
}
