#include <bits/stdc++.h>   using namespace std;   inline int readint() {     int x = 0;     bool f = 0;     char c = getchar();     while (!isdigit(c) && c !=  - ) c = getchar();     if (c ==  - ) {       f = 1;       c = getchar();     }     while (isdigit(c)) {       x = x * 10 + c -  0 ;       c = getchar();     }     return f ? -x : x;   }   const int maxn = 4e5 + 5;   int n, m, c[maxn];   vector<int> g[maxn];   int fa[maxn];   void dfs(int u) {     for (int i = 0; i < (int)g[u].size(); i++) {       int v = g[u][i];       if (v == fa[u]) continue;       fa[v] = u;       dfs(v);     }   }   struct lct {     int fa[maxn], ch[maxn][2], s[maxn], s2[maxn];     long long ss[maxn];     void init() {       for (int i = 1; i <= n; i++) s[i] = 1;     }     void pushup(int x) {       s[x] = s2[x] + 1;       if (ch[x][0]) s[x] += s[ch[x][0]];       if (ch[x][1]) s[x] += s[ch[x][1]];     }     bool isroot(int x) {       return !fa[x] || (ch[fa[x]][0] != x && ch[fa[x]][1] != x);     }     void rotate(int x) {       int y = fa[x], z = fa[fa[x]];       if (!isroot(y)) ch[z][ch[z][1] == y] = x;       bool d = ch[y][1] == x;       int k = ch[x][!d];       if (k) fa[k] = y;       ch[y][d] = k;       ch[x][!d] = y;       fa[y] = x;       fa[x] = z;       pushup(y);       pushup(x);     }     void splay(int x) {       while (!isroot(x)) {         int y = fa[x], z = fa[fa[x]];         if (!isroot(y)) {           if ((ch[y][1] == x) ^ (ch[z][1] == y))             rotate(x);           else             rotate(y);         }         rotate(x);       }     }     void access(int x) {       int y = 0;       while (x) {         splay(x);         if (ch[x][1]) {           s2[x] += s[ch[x][1]];           ss[x] += 1ll * s[ch[x][1]] * s[ch[x][1]];         }         ch[x][1] = y;         if (y) {           s2[x] -= s[y];           ss[x] -= 1ll * s[y] * s[y];         }         y = x;         x = fa[x];       }     }     int findroot(int x) {       access(x);       splay(x);       while (ch[x][0]) x = ch[x][0];       splay(x);       return x;     }     void link(int x, int y) {       access(y);       splay(y);       splay(x);       fa[x] = y;       s2[y] += s[x];       ss[y] += 1ll * s[x] * s[x];       pushup(y);     }     void cut(int x, int y) {       access(y);       splay(y);       splay(x);       fa[x] = 0;       s2[y] -= s[x];       ss[y] -= 1ll * s[x] * s[x];       pushup(y);     }   } t;   vector<pair<int, int> > q[maxn];   bool c2[maxn];   long long query(int u) {     int x = t.findroot(u);     if (c2[x])       return 1ll * t.s[t.ch[x][1]] * t.s[t.ch[x][1]];     else       return 1ll * t.s[x] * t.s[x];   }   long long modify(int u) {     c2[u] ^= 1;     if (c2[u]) {       if (u == 1) {         t.access(1);         return t.ss[1] - 1ll * t.s[1] * t.s[1];       } else {         long long res = -query(u);         t.cut(u, fa[u]);         t.access(u);         res += t.ss[u];         if (!c2[fa[u]]) res += query(fa[u]);         return res;       }     } else {       if (u == 1) {         t.access(1);         return 1ll * t.s[1] * t.s[1] - t.ss[1];       } else {         t.access(u);         long long res = -t.ss[u];         if (!c2[fa[u]]) res -= query(fa[u]);         t.link(u, fa[u]);         res += query(u);         return res;       }     }   }   long long ans[maxn];   void solve(int c) {     for (int i = 0; i < (int)q[c].size(); i++)       ans[q[c][i].first] += modify(q[c][i].second);     for (int i = (int)q[c].size() - 1; i >= 0; i--) modify(q[c][i].second);   }   int main() {     n = readint();     m = readint();     for (int i = 1; i <= n; i++) c[i] = readint();     for (int i = 1; i < n; i++) {       int u, v;       u = readint();       v = readint();       g[u].push_back(v);       g[v].push_back(u);     }     dfs(1);     t.init();     for (int i = 2; i <= n; i++) t.link(i, fa[i]);     for (int i = 1; i <= n; i++) q[c[i]].push_back(pair<int, int>(0, i));     for (int i = 1; i <= m; i++) {       int u, x;       u = readint();       x = readint();       q[c[u]].push_back(pair<int, int>(i, u));       q[c[u] = x].push_back(pair<int, int>(i, u));     }     for (int i = 1; i <= n; i++) solve(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;   }