#include <bits/stdc++.h>
using namespace std;
inline int getint() {
  int num = 0, flag = 1;
  char c;
  while ((c = getchar()) < '0' || c > '9')
    if (c == '-') flag = -1;
  while (c >= '0' && c <= '9') num = num * 10 + c - 48, c = getchar();
  return num * flag;
}
int n, m;
int c[400005], fa[400005], col[400005];
int fir[400005], nxt[400005 << 1], to[400005 << 1], cnt;
vector<pair<int, int> > V[400005];
int F[400005], ch[400005][2], sz[400005], vsz[400005];
long long Num, ssz[400005], Ans[400005];
inline void newnode(int u, int v) {
  to[++cnt] = v, nxt[cnt] = fir[u], fir[u] = cnt;
}
inline void dfs(int u) {
  for (int i = fir[u]; i; i = nxt[i])
    if (to[i] != F[u]) F[to[i]] = u, dfs(to[i]);
}
inline bool isroot(int x) { return ch[fa[x]][0] != x && ch[fa[x]][1] != x; }
inline void update(int x) { sz[x] = sz[ch[x][0]] + sz[ch[x][1]] + vsz[x] + 1; }
inline void rotate(int x) {
  int y = fa[x], z = fa[y];
  int l = (ch[y][1] == x), r = l ^ 1;
  if (!isroot(y)) {
    if (ch[z][0] == y)
      ch[z][0] = x;
    else
      ch[z][1] = x;
  }
  fa[x] = z, fa[y] = x, ch[y][l] = ch[x][r], fa[ch[x][r]] = y, ch[x][r] = y;
  update(y), update(x);
}
inline void splay(int x) {
  while (!isroot(x)) {
    int y = fa[x], z = fa[y];
    if (!isroot(y)) {
      if ((ch[y][0] == x) ^ (ch[z][0] == y))
        rotate(x);
      else
        rotate(y);
    }
    rotate(x);
  }
}
inline void access(int x) {
  for (int t = 0; x; t = x, x = fa[x]) {
    splay(x);
    vsz[x] -= sz[t];
    vsz[x] += sz[ch[x][1]];
    ssz[x] -= 1ll * sz[t] * sz[t];
    ssz[x] += 1ll * sz[ch[x][1]] * sz[ch[x][1]];
    ch[x][1] = t, update(x);
  }
}
inline int getroot(int x) {
  access(x), splay(x);
  while (ch[x][0]) x = ch[x][0], splay(x);
  return x;
}
inline void link(int x, int y) {
  splay(x);
  Num -= ssz[x] + 1ll * sz[ch[x][1]] * sz[ch[x][1]];
  int z = getroot(y);
  access(x), splay(z);
  Num -= 1ll * sz[ch[z][1]] * sz[ch[z][1]];
  fa[x] = y;
  splay(y);
  vsz[y] += sz[x];
  ssz[y] += 1ll * sz[x] * sz[x];
  update(y), access(x);
  splay(z);
  Num += 1ll * sz[ch[z][1]] * sz[ch[z][1]];
}
inline void cut(int x, int y) {
  access(x), Num += ssz[x];
  int z = getroot(y);
  access(x), splay(z);
  Num -= 1ll * sz[ch[z][1]] * sz[ch[z][1]];
  splay(x);
  ch[x][0] = fa[ch[x][0]] = 0;
  update(x), splay(z);
  Num += 1ll * sz[ch[z][1]] * sz[ch[z][1]];
}
int main() {
  n = getint(), m = getint();
  for (int i = 1; i <= n; i++)
    c[i] = getint(), V[c[i]].push_back(make_pair(0, i));
  for (int i = 1; i < n; i++) {
    int u = getint(), v = getint();
    newnode(u, v), newnode(v, u);
  }
  F[1] = n + 1, dfs(1);
  for (int i = 1; i <= m; i++) {
    int u = getint(), v = getint();
    V[c[u]].push_back(make_pair(i, u));
    c[u] = v;
    V[c[u]].push_back(make_pair(i, u));
  }
  for (int i = 1; i <= n + 1; i++) update(i);
  for (int i = 1; i <= n; i++) link(i, F[i]);
  for (int i = 1; i <= n; i++) {
    long long lst = 0;
    for (int j = 0; j < V[i].size(); j++) {
      int u = V[i][j].second;
      col[u] ? link(u, F[u]) : cut(u, F[u]);
      col[u] ^= 1;
      Ans[V[i][j].first] += 1ll * n * n - Num - lst;
      lst = 1ll * n * n - Num;
    }
    for (int j = 0; j < V[i].size(); j++) {
      int u = V[i][j].second;
      if (col[u]) link(u, F[u]), col[u] ^= 1;
    }
  }
  for (int i = 1; i <= m; i++) Ans[i] += Ans[i - 1];
  for (int i = 0; i <= m; i++) printf("%lld\n", Ans[i]);
}
