#include <bits/stdc++.h>
using namespace std;
int gi() {
  int res = 0, w = 1;
  char ch = getchar();
  while (ch != '-' && !isdigit(ch)) ch = getchar();
  if (ch == '-') w = -1, ch = getchar();
  while (isdigit(ch)) res = res * 10 + ch - '0', ch = getchar();
  return res * w;
}
const int MAX_N = 4e5 + 5;
int N, M, a[MAX_N];
vector<pair<int, int> > vec[MAX_N];
vector<int> G[MAX_N];
int fa[MAX_N];
namespace LCT {
int fa[MAX_N], ch[MAX_N][2], sz[MAX_N], si[MAX_N];
long long sz2[MAX_N], si2[MAX_N];
void pushup(int x) {
  sz[x] = sz[ch[x][0]] + sz[ch[x][1]] + si[x];
  sz2[x] = 1ll * sz[ch[x][0]] * sz[ch[x][0]] +
           1ll * sz[ch[x][1]] * sz[ch[x][1]] + si2[x];
}
bool get(int x) { return ch[fa[x]][1] == x; }
bool nrt(int x) { return ch[fa[x]][0] == x || ch[fa[x]][1] == x; }
void rot(int x) {
  int y = fa[x], z = fa[y], k = get(x);
  fa[x] = z;
  if (nrt(y)) ch[z][get(y)] = x;
  ch[y][k] = ch[x][k ^ 1];
  if (ch[y][k]) fa[ch[y][k]] = y;
  ch[x][k ^ 1] = y, fa[y] = x;
  pushup(y);
}
void splay(int x) {
  while (nrt(x)) {
    int y = fa[x];
    if (nrt(y)) rot(get(x) ^ get(y) ? x : y);
    rot(x);
  }
  pushup(x);
}
void access(int x) {
  for (int y = 0; x; y = x, x = fa[x]) {
    splay(x);
    si[x] += sz[ch[x][1]], si2[x] += 1ll * sz[ch[x][1]] * sz[ch[x][1]];
    ch[x][1] = y;
    si[x] -= sz[ch[x][1]], si2[x] -= 1ll * sz[ch[x][1]] * sz[ch[x][1]];
    pushup(x);
  }
}
void link(int x, int y) {
  access(x), splay(x), access(y), splay(y);
  fa[x] = y, si[y] += sz[x], si2[y] += 1ll * sz[x] * sz[x], pushup(y);
}
void cut(int x, int y) {
  access(x), splay(x), access(y), splay(y);
  fa[x] = 0, si[y] -= sz[x], si2[y] -= 1ll * sz[x] * sz[x], pushup(y);
}
int findrt(int x) {
  access(x), splay(x);
  while (ch[x][0]) x = ch[x][0];
  return splay(x), x;
}
long long query(int x) {
  access(x), splay(x);
  return sz2[x];
}
void clear() {
  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 x) {
  for (int v : G[x])
    if (v != fa[x]) fa[v] = x, dfs(v);
}
long long ans[MAX_N];
int main() {
  N = gi(), M = gi();
  for (int i = 1; i <= N; i++) a[i] = gi();
  for (int i = 1; i < N; i++) {
    int u = gi(), v = gi();
    G[u].push_back(v), G[v].push_back(u);
  }
  fa[1] = N + 1, dfs(1);
  for (int i = 1; i <= N; i++) vec[a[i]].emplace_back(0, i << 1 | 1);
  for (int i = 1; i <= M; i++) {
    int x = gi(), y = gi();
    vec[a[x]].emplace_back(i, x << 1);
    a[x] = y;
    vec[a[x]].emplace_back(i, x << 1 | 1);
  }
  for (int i = 1; i <= N; i++) vec[a[i]].emplace_back(M + 1, i << 1);
  LCT::clear();
  for (int i = 1; i <= N; i++)
    for (auto it : vec[i]) {
      int x = it.second >> 1, rt = LCT::findrt(fa[x]);
      if (it.second & 1) {
        ans[it.first] += LCT::query(rt);
        LCT::cut(x, fa[x]);
        ans[it.first] -= LCT::query(x) + LCT::query(rt);
      } else {
        ans[it.first] += LCT::query(x) + LCT::query(rt);
        LCT::link(x, fa[x]);
        ans[it.first] -= LCT::query(rt);
      }
    }
  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;
}
