#include <bits/stdc++.h>
using namespace std;
namespace Fastio {
const int vol = 1 << 24;
char buf[vol], *p1, *p2;
char Getchar() {
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, vol, stdin), p1 == p2)
             ? EOF
             : *p1++;
}
int input() {
  int x = 0, F = 1;
  char c = Getchar();
  while (c > '9' || c < '0') {
    if (c == '-') F = -1;
    c = Getchar();
  }
  while (c <= '9' && c >= '0') {
    x = x * 10 + c - '0';
    c = Getchar();
  }
  return x * F;
}
}  // namespace Fastio
using Fastio::input;
const int N = 400005;
int n, m;
int col[N], anc[N];
long long ans[N];
vector<int> T[N];
void add(int l, int r, long long x) {
  ans[l] += x;
  ans[r + 1] -= x;
}
void dfs(int u) {
  for (int i = 0; i < T[u].size(); i++)
    if (T[u][i] != anc[u]) anc[T[u][i]] = u, dfs(T[u][i]);
}
stack<int> sta;
vector<pair<int, int> > lm[N];
struct LCT {
  int fa[N], ch[N][2], siz[N], sv[N];
  long long sv2[N];
  int nroot(int u) { return ch[fa[u]][0] == u || ch[fa[u]][1] == u; }
  void pushup(int u) { siz[u] = siz[ch[u][0]] + siz[ch[u][1]] + sv[u] + 1; }
  void rot(int u) {
    int v = fa[u], t = fa[v], d = (u == ch[v][1]);
    fa[u] = t;
    if (nroot(v)) ch[t][v == ch[t][1]] = u;
    fa[ch[u][d ^ 1]] = v;
    ch[v][d] = ch[u][d ^ 1];
    fa[v] = u;
    ch[u][d ^ 1] = v;
    pushup(v);
    pushup(u);
  }
  void splay(int u) {
    while (nroot(u)) {
      int v = fa[u];
      if (nroot(v)) rot(u == ch[v][1] ^ v == ch[fa[v]][1] ? u : v);
      rot(u);
    }
  }
  int access(int u) {
    int v = 0;
    for (; u; v = u, u = fa[u]) {
      splay(u);
      sv[u] += siz[ch[u][1]] - siz[v];
      sv2[u] += 1ll * siz[ch[u][1]] * siz[ch[u][1]] - 1ll * siz[v] * siz[v];
      ch[u][1] = v;
      pushup(u);
    }
    return v;
  }
  void makeroot(int u) {
    access(u);
    splay(u);
  }
  void Link(int u, int v) {
    makeroot(u);
    makeroot(v);
    fa[u] = v;
    sv[v] += siz[u];
    sv2[v] += 1ll * siz[u] * siz[u];
    pushup(v);
  }
  void Cut(int u, int v) {
    access(u);
    splay(v);
    fa[u] = ch[v][1] = 0;
    pushup(v);
  }
  int Findrt(int u) {
    makeroot(u);
    while (ch[u][0]) u = ch[u][0];
    splay(u);
    return u;
  }
  long long qs(int u) {
    u = Findrt(u);
    return sv2[u] + 1ll * siz[ch[u][1]] * siz[ch[u][1]];
  }
} lt;
int main() {
  int x, y;
  n = input();
  m = input();
  for (int i = 1; i <= n; i++)
    lm[col[i] = input()].push_back(pair<int, int>(0, i));
  for (int i = 1; i < n; i++)
    x = input(), y = input(), T[x].push_back(y), T[y].push_back(x);
  for (int i = 1; i <= m; i++) {
    x = input();
    y = input();
    if (col[x] == y) continue;
    lm[col[x]].push_back(pair<int, int>(i, x));
    lm[y].push_back(pair<int, int>(i, x));
    col[x] = y;
  }
  dfs(1);
  anc[1] = n + 1;
  for (int i = 1; i <= n; i++) lt.Link(i, anc[i]);
  memset(col, 0, sizeof(col));
  for (int i = 1; i <= n; i++) {
    long long sum = 1ll * n * n;
    for (int j = 0; j < lm[i].size(); j++) {
      x = lm[i][j].second;
      sta.push(x);
      sum -= lt.qs(x) + (col[x] ? lt.qs(anc[x]) : 0);
      col[x] ? lt.Link(x, anc[x]) : lt.Cut(x, anc[x]);
      col[x] ^= 1;
      sum += lt.qs(x) + (col[x] ? lt.qs(anc[x]) : 0);
      add(lm[i][j].first, j + 1 < lm[i].size() ? lm[i][j + 1].first - 1 : m,
          1ll * n * n - sum);
    }
    for (; !sta.empty(); sta.pop())
      if (col[x = sta.top()]) lt.Link(x, anc[x]), col[x] = 0;
  }
  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;
}
