#include <bits/stdc++.h>
inline int read() {
  char c = getchar();
  int x = 0, ft = 1;
  for (; c < '0' || c > '9'; c = getchar())
    if (c == '-') ft = -1;
  for (; c >= '0' && c <= '9'; c = getchar()) x = x * 10 + c - '0';
  return x * ft;
}
const int N = 4e5 + 5;
int n, m, h[N], edge_cnt, col[N], op[N], pa[N];
struct Edge {
  int to, nex;
} e[N << 1];
std::vector<std::pair<int, int>> g[N];
inline void add_edge(int u, int v) {
  e[++edge_cnt] = (Edge){v, h[u]};
  h[u] = edge_cnt;
  e[++edge_cnt] = (Edge){u, h[v]};
  h[v] = edge_cnt;
}
void dfs(int u, int pre) {
  pa[u] = pre;
  for (int i = h[u]; i; i = e[i].nex) {
    int v = e[i].to;
    if (v != pre) dfs(v, u);
  }
}
int fa[N], ch[N][2], sz[N], isz[N];
long long imz[N], sum, las, ans[N];
inline long long F(int x) { return 1ll * sz[x] * sz[x]; }
inline bool no_root(int x) { return ch[fa[x]][0] == x || ch[fa[x]][1] == x; }
inline bool son(int x) { return ch[fa[x]][1] == x; }
inline void push_up(int x) { sz[x] = sz[ch[x][0]] + sz[ch[x][1]] + isz[x] + 1; }
inline void rotate(int x) {
  int y = fa[x], z = fa[y], k = son(x), w = ch[x][!k];
  if (no_root(y)) ch[z][son(y)] = x;
  ch[x][!k] = y;
  ch[y][k] = w;
  if (w) fa[w] = y;
  fa[y] = x;
  fa[x] = z;
  push_up(y);
}
inline void splay(int x) {
  for (int y = fa[x]; no_root(x); rotate(x), y = fa[x]) {
    if (no_root(y)) rotate(son(x) ^ son(y) ? x : y);
  }
  push_up(x);
}
inline void access(int x) {
  for (int y = 0; x; x = fa[y = x]) {
    splay(x);
    isz[x] += sz[ch[x][1]];
    imz[x] += F(ch[x][1]);
    ch[x][1] = y;
    isz[x] -= sz[ch[x][1]];
    imz[x] -= F(ch[x][1]);
  }
}
inline int find_root(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) {
  access(x);
  sum -= imz[x];
  int rt = find_root(y);
  access(x);
  splay(rt);
  sum -= F(ch[rt][1]);
  splay(y);
  fa[x] = y;
  isz[y] += sz[x];
  imz[y] += F(x);
  push_up(y);
  access(x);
  splay(rt);
  sum += F(ch[rt][1]);
}
inline void cut(int x, int y) {
  access(x);
  sum += imz[x];
  int rt = find_root(y);
  access(x);
  splay(rt);
  sum -= F(ch[rt][1]);
  splay(x);
  ch[x][0] = fa[ch[x][0]] = 0;
  push_up(x);
  splay(rt);
  sum += F(ch[rt][1]);
}
int main() {
  n = read();
  m = read();
  for (int u = 1; u <= n; ++u)
    g[col[u] = read()].push_back(std::make_pair(0, u));
  for (int i = 1; i <= n - 1; ++i) add_edge(read(), read());
  for (int i = 1; i <= m; ++i) {
    int u = read(), x = read();
    g[col[u]].push_back(std::make_pair(i, u));
    g[col[u] = x].push_back(std::make_pair(i, u));
  }
  for (int u = 1; u <= n + 1; ++u) push_up(u);
  dfs(1, n + 1);
  for (int u = 1; u <= n; ++u) link(u, pa[u]);
  for (int u = 1; u <= n; ++u)
    if ((int)g[u].size()) {
      las = 0;
      for (auto o : g[u]) {
        int t = o.first, x = o.second;
        op[x] ^= 1;
        if (op[x])
          cut(x, pa[x]);
        else
          link(x, pa[x]);
        ans[t] += 1ll * n * n - sum - las;
        las = 1ll * n * n - sum;
      }
      for (auto o : g[u]) {
        int t = o.first, x = o.second;
        op[x] ^= 1;
        if (op[x])
          cut(x, pa[x]);
        else
          link(x, pa[x]);
      }
    }
  for (int i = 1; i <= m; ++i) ans[i] += ans[i - 1];
  for (int i = 0; i <= m; ++i) printf("%lld\n", ans[i]);
  return 0;
}
