func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long N = 2e6 + 10;   const long long mod = 1e9 + 7;   struct Dsu {     long long fa[N << 1], d[N << 1];     struct Tmp {       long long x, y, add;     };     stack<Tmp> s;     long long find(long long x) {       while (x != fa[x]) x = fa[x];       return x;     }     void init(long long n) {       while (!s.empty()) s.pop();       for (long long i = 1; i <= n; i++) fa[i] = i, d[i] = 0;     }     void merge(long long x, long long y) {       long long xx = find(x);       long long yy = find(y);       if (xx == yy) return;       if (d[xx] > d[yy]) swap(xx, yy);       s.push((Tmp){xx, yy, d[xx] == d[yy]});       fa[xx] = yy;       d[yy] += (d[xx] == d[yy]);     }     void ret(long long o) {       while (s.size() > o) {         Tmp x = s.top();         fa[x.x] = x.x;         d[x.y] -= x.add;         s.pop();       }     }   } t;   long long read() {     long long x = 0, f = 1;     char c = getchar();     while (c <  0  || c >  9 ) {       if (c ==  - ) f = -1;       c = getchar();     }     while (c >=  0  && c <=  9 ) x = (x << 1) + (x << 3) + c -  0 , c = getchar();     return x * f;   }   long long c[N];   map<pair<long long, long long>, vector<pair<long long, long long>>> mp;   int main() {     long long n = read(), m = read(), k = read();     for (long long i = 1; i <= n; i++) c[i] = read();     vector<pair<long long, long long>> e(m + 1);     t.init(2 * n);     for (long long i = 1; i <= m; i++) e[i].first = read(), e[i].second = read();     vector<long long> z(k + 1);     for (long long i = 1; i <= m; i++) {       long long u = e[i].first, v = e[i].second;       if (c[u] == c[v]) {         long long x = t.find(u);         long long y = t.find(v);         if (x == y) {           z[c[u]] = 1;         } else {           t.merge(u, v + n);           t.merge(u + n, v);         }       } else {         pair<long long, long long> tmp = {min(c[u], c[v]), max(c[v], c[u])};         mp[tmp].push_back({u, v});       }     }     long long res = 1ll * k * (k - 1) / 2;     long long gg = 0;     for (long long i = 1; i <= k; i++)       if (z[i] == 1) gg++;     res -= (gg) * (gg - 1) / 2 + gg * (k - gg);     for (auto now : mp) {       if (z[now.first.first] || z[now.first.second]) continue;       auto tmp = now.second;       long long o = t.s.size();       for (pair<long long, long long> qwq : tmp) {         long long u = qwq.first;         long long v = qwq.second;         long long x = t.find(u);         long long y = t.find(v);         if (x == y) {           res -= 1;           break;         } else {           t.merge(u, v + n);           t.merge(u + n, v);         }       }       t.ret(o);     }     cout << res << endl;   }   