#include <bits/stdc++.h>
using namespace std;
int gi() {
  int x = 0, w = 1;
  char ch = getchar();
  while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
  if (ch == '-') w = 0, ch = getchar();
  while (ch >= '0' && ch <= '9')
    x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
  return w ? x : -x;
}
const int N = 4e5 + 5;
int n, m, col[N], fa[N];
long long ans[N];
vector<int> E[N];
vector<pair<int, int> > vec[N];
namespace lct {
int fa[N], ch[2][N], sz[N], si[N];
long long sz2[N], si2[N];
bool son(int x) { return x == ch[1][fa[x]]; }
bool isrt(int x) { return x != ch[0][fa[x]] && x != ch[1][fa[x]]; }
void up(int x) {
  sz[x] = sz[ch[0][x]] + sz[ch[1][x]] + si[x];
  sz2[x] = 1ll * sz[ch[0][x]] * sz[ch[0][x]] +
           1ll * sz[ch[1][x]] * sz[ch[1][x]] + si2[x];
}
void rotate(int x) {
  int y = fa[x], z = fa[y], c = son(x);
  ch[c][y] = ch[c ^ 1][x];
  if (ch[c][y]) fa[ch[c][y]] = y;
  fa[x] = z;
  if (!isrt(y)) ch[son(y)][z] = x;
  ch[c ^ 1][x] = y;
  fa[y] = x;
  up(y);
}
void splay(int x) {
  for (int y = fa[x]; !isrt(x); rotate(x), y = fa[x])
    if (!isrt(y)) rotate(son(x) ^ son(y) ? x : y);
  up(x);
}
void access(int x) {
  for (int y = 0; x; y = x, x = fa[x]) {
    splay(x);
    si[x] += sz[ch[1][x]];
    si2[x] += 1ll * sz[ch[1][x]] * sz[ch[1][x]];
    ch[1][x] = y;
    si[x] -= sz[y];
    si2[x] -= 1ll * sz[y] * sz[y];
    up(x);
  }
}
void link(int x, int y) {
  access(y);
  splay(y);
  splay(x);
  fa[x] = y;
  si[y] += sz[x];
  si2[y] += 1ll * sz[x] * sz[x];
  up(y);
}
void cut(int x, int y) {
  access(x);
  access(y);
  splay(y);
  splay(x);
  fa[x] = 0;
  si[y] -= sz[x];
  si2[y] -= 1ll * sz[x] * sz[x];
  up(y);
}
int findrt(int x) {
  access(x);
  splay(x);
  while (ch[0][x]) x = ch[0][x];
  splay(x);
  return x;
}
long long query(int x) {
  splay(x);
  return sz2[x];
}
void init() {
  for (int i = 1; i <= n + 1; ++i) sz[i] = si[i] = 1;
  for (int i = 1; i <= n; ++i) link(i, ::fa[i]);
}
}  // namespace lct
void dfs(int u) {
  for (int v : E[u])
    if (v != fa[u]) fa[v] = u, dfs(v);
}
int main() {
  n = gi();
  m = gi();
  for (int i = 1; i <= n; ++i) col[i] = gi();
  for (int i = 1; i < n; ++i) {
    int x = gi(), y = gi();
    E[x].push_back(y);
    E[y].push_back(x);
  }
  fa[1] = n + 1;
  dfs(1);
  for (int i = 1; i <= n; ++i) vec[col[i]].push_back(make_pair(0, i << 1 | 1));
  for (int i = 1; i <= m; ++i) {
    int x = gi(), y = gi();
    vec[col[x]].push_back(make_pair(i, x << 1));
    col[x] = y;
    vec[col[x]].push_back(make_pair(i, x << 1 | 1));
  }
  for (int i = 1; i <= n; ++i) vec[col[i]].push_back(make_pair(m + 1, i << 1));
  lct::init();
  for (int i = 1; i <= n; ++i)
    for (auto x : vec[i]) {
      int u = x.second >> 1, f = lct::findrt(fa[u]);
      if (x.second & 1) {
        ans[x.first] += lct::query(f);
        lct::cut(u, fa[u]);
        ans[x.first] -= lct::query(u) + lct::query(f);
      } else {
        ans[x.first] += lct::query(u) + lct::query(f);
        lct::link(u, fa[u]);
        ans[x.first] -= lct::query(f);
      }
    }
  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;
}
