#include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 10;
int n, Q, c[N], col[N], fa[N], u, v, x;
vector<int> G[N];
long long tot, ans[N];
vector<pair<int, int>> p[N];
inline long long sqr(long long x) { return x * x; }
namespace LCT {
int ch[N][2], fa[N], sz[N], lsz[N];
long long v[N];
void print() {
  for (int i = (1); i <= (n + 1); ++i)
    printf("id:%d fa:%d lc:%d rc:%d sz:%d lsz:%d v:%lld\n", i, fa[i], ch[i][0],
           ch[i][1], sz[i], lsz[i], v[i]);
  puts("");
}
inline bool isrt(int x) { return (ch[fa[x]][0] ^ x) && (ch[fa[x]][1] ^ x); }
inline int get(int x) { return ch[fa[x]][1] == x; }
inline void up(int x) { sz[x] = 1 + sz[ch[x][0]] + sz[ch[x][1]] + lsz[x]; }
inline void rot(int x) {
  int y = fa[x], z = fa[y], k = get(x);
  fa[x] = z;
  if (z && !isrt(y)) ch[z][ch[z][1] == y] = x;
  ch[y][k] = ch[x][!k];
  if (ch[x][!k]) fa[ch[x][!k]] = y;
  ch[x][!k] = y;
  fa[y] = x;
  up(y);
}
void splay(int x) {
  for (int y; !isrt(x); rot(x))
    if (!isrt(y = fa[x])) rot(get(y) == get(x) ? y : x);
  up(x);
}
void access(int x) {
  for (int w = 0; x; w = x, x = fa[x])
    splay(x), lsz[x] += sz[ch[x][1]], v[x] += sqr(sz[ch[x][1]]),
        ch[x][1] = w, lsz[x] -= sz[ch[x][1]], v[x] -= sqr(sz[ch[x][1]]), up(x);
}
int findrt(int x) {
  access(x);
  splay(x);
  while (ch[x][0]) x = ch[x][0];
  splay(x);
  return x;
}
void link(int x, int y) {
  splay(x);
  tot -= v[x] + sqr(sz[ch[x][1]]);
  int z = findrt(y);
  tot -= sqr(sz[ch[z][1]]);
  access(x);
  fa[x] = y;
  splay(y);
  lsz[y] += sz[x];
  v[y] += sqr(sz[x]);
  up(y);
  access(x);
  splay(z);
  tot += sqr(sz[ch[z][1]]);
}
void cut(int x, int y) {
  access(x);
  tot += v[x];
  int z = findrt(y);
  access(x);
  splay(z);
  tot -= sqr(sz[ch[z][1]]);
  splay(x);
  ch[x][0] = fa[ch[x][0]] = 0;
  up(x);
  splay(z);
  tot += sqr(sz[ch[z][1]]);
}
}  // namespace LCT
using LCT::cut;
using LCT::link;
void dfs(int u) {
  for (int v : G[u])
    if (v ^ fa[u]) fa[v] = u, dfs(v);
}
int main() {
  scanf("%d%d", &n, &Q);
  for (int i = (1); i <= (n); ++i)
    scanf("%d", c + i), p[c[i]].emplace_back(0, i);
  for (int i = (1); i <= (n - 1); ++i)
    scanf("%d%d", &u, &v), G[u].push_back(v), G[v].push_back(u);
  fa[1] = n + 1;
  dfs(1);
  for (int i = (1); i <= (Q); ++i)
    scanf("%d%d", &u, &x), p[c[u]].emplace_back(i, u),
        c[u] = x, p[c[u]].emplace_back(i, u);
  for (int i = (1); i <= (n + 1); ++i) LCT::sz[i] = 1;
  for (int i = (1); i <= (n); ++i) link(i, fa[i]);
  for (int i = (1); i <= (n); ++i) {
    long long lst = 0;
    for (auto x : p[i]) {
      int u = x.second;
      col[u] ? link(u, fa[u]) : cut(u, fa[u]);
      col[u] ^= 1;
      ans[x.first] += 1ll * n * n - tot - lst;
      lst = 1ll * n * n - tot;
    }
    reverse(p[i].begin(), p[i].end());
    for (auto x : p[i]) {
      int u = x.second;
      col[u] ? link(u, fa[u]) : cut(u, fa[u]);
      col[u] ^= 1;
    }
  }
  for (int i = (1); i <= (Q); ++i) ans[i] += ans[i - 1];
  for (int i = (0); i <= (Q); ++i) printf("%lld\n", ans[i]);
  return 0;
}
