#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, f = 1, c = getchar();
  while (c < 48) c == '-' && (f = -1), c = getchar();
  while (c > 47) x = x * 10 + c - '0', c = getchar();
  return x * f;
}
const int MAXN = 500005;
std::vector<int> G[MAXN];
vector<pair<int, int>> q[MAXN];
long long vsz2[MAXN], c[MAXN], ans[MAXN], f[MAXN];
int ch[MAXN][2], fa[MAXN], size[MAXN];
int o[MAXN], vsize[MAXN];
long long n, m, sum;
inline void addedge(int u, int v) {
  G[u].push_back(v);
  G[v].push_back(u);
}
auto sqr = [](long long x) { return x * x; };
void dfs(int u, int p) {
  f[u] = p;
  for (int v : G[u])
    if (v != p) dfs(v, u);
}
inline bool notroot(int x) { return ch[fa[x]][0] == x || ch[fa[x]][1] == x; }
inline void pushup(int x) {
  size[x] = size[ch[x][0]] + size[ch[x][1]] + vsize[x] + 1;
}
inline void rotate(int x) {
  int y = fa[x], z = fa[y];
  int k = ch[y][1] == x, w = ch[x][k ^ 1];
  if (notroot(y)) ch[z][ch[z][1] == y] = x;
  fa[x] = z, fa[y] = x, fa[w] = y;
  ch[x][k ^ 1] = y;
  ch[y][k] = w;
  pushup(y);
}
inline void splay(int x) {
  while (notroot(x)) {
    int y = fa[x], z = fa[y];
    if (notroot(y)) rotate(ch[y][1] == x ^ ch[z][1] == y ? x : y);
    rotate(x);
  }
  pushup(x);
}
inline void access(int x) {
  for (int y = 0; x; x = fa[y = x]) {
    splay(x);
    vsize[x] += size[ch[x][1]];
    vsz2[x] += sqr(size[ch[x][1]]);
    ch[x][1] = y;
    vsize[x] -= size[ch[x][1]], vsz2[x] -= sqr(size[ch[x][1]]);
  }
}
inline int findroot(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);
  sum -= vsz2[x] + sqr(size[ch[x][1]]);
  int z = findroot(y);
  splay(z), sum -= sqr(size[ch[z][1]]);
  splay(y), fa[x] = y, vsize[y] += size[x];
  vsz2[y] += sqr(size[x]), pushup(y);
  access(x), splay(z), sum += sqr(size[ch[z][1]]);
}
inline void cut(int x, int y) {
  access(x);
  sum += vsz2[x];
  int z = findroot(y);
  access(x);
  splay(z);
  sum -= sqr(size[ch[z][1]]);
  splay(x);
  ch[x][0] = fa[ch[x][0]] = 0, pushup(x);
  splay(z);
  sum += sqr(size[ch[z][1]]);
}
inline void calc(int c) {
  long long lst = 0, x = 0;
  for (auto i : q[c]) {
    ((o[x = i.first]) ? link : cut)(x, f[x]);
    ans[i.second] += sqr(n) - sum - lst;
    o[x] ^= 1;
    lst = sqr(n) - sum;
  }
  for (auto i : q[c])
    if (o[x = i.first]) link(x, f[x]), o[x] = 0;
}
int main(int argc, char const *argv[]) {
  n = read(), m = read();
  for (int i = 1; i <= n; ++i) c[i] = read();
  for (int i = 1; i <= n; ++i) q[c[i]].push_back(make_pair(i, 0));
  for (int i = 1; i < n; ++i) addedge(read(), read());
  for (int i = 1, x, w; i <= m; ++i) {
    x = read();
    w = read();
    q[c[x]].push_back(make_pair(x, i));
    c[x] = w;
    q[c[x]].push_back(make_pair(x, i));
  }
  dfs(1, n + 1);
  for (int i = 1; i <= n + 1; ++i) size[i] = 1;
  for (int i = 1; i <= n; ++i) link(i, f[i]);
  for (int i = 1; i <= n; ++i) calc(i);
  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;
}
