#pragma region header #include #include using namespace std; using namespace atcoder; // clang-format off struct Fast {Fast() {std::cin.tie(0); ios::sync_with_stdio(false);}} fast; inline void IN(void) { return; } template void IN(First &first, Rest &...rest) { cin >> first; IN(rest...); return; } template istream &operator>>(istream &is, pair &p) { is >> p.first >> p.second; return is; } template istream &operator>>(istream &is, vector &v) { for (auto &x : v) is >> x; return is; } template ostream &operator<<(ostream &os, vector &v) { for (auto &x : v) os << x << " "; os << endl; return os; } // templetes //alias using ull = unsigned long long; using ll = long long; using vi = vector; using vvi = vector; using vll = vector; using vvll = vector; using vb = vector; using vvb = vector; using vs = vector; using pll = pair; //define short #define vec vector #define all(obs) (obs).begin(), (obs).end() #define YESNO(cond) (cond) ? cout << "YES" << endl : cout << "NO" << endl; #define YesNo(cond) (cond) ? cout << "Yes" << endl : cout << "No" << endl; #define yesno(cond) (cond) ? cout << "yes" << endl : cout << "no" << endl; #define sortv(obs) sort(all(obs)) #define rsortv(obs) reverse(sort(all(obs))) #define bitu(n,i) (((n)>>(i))&1) #define dig10(n) to_string(n).size() #define bcnt(n) __builtin_popcount(n) #define bcntll(n) __builtin_popcountll(n) #define F first #define S second #define pb push_back #define pq priority_queue //define loop #define rep(i, a,b) for(ll i = a; i < (b); i++) #define rrep(i, a,b) for(ll i = a; i >= (b); i--) //define INF const ll INF = 1e18; template inline void chmin(T1 &a,T2 b){ if(a>b) a = b; } template inline void chmax(T1 &a,T2 b){ if(a> n >> m; vll c(n); cin >> c; rep(i,0,n) c[i]--; //map 頂点iは、色jのk番目の頂点 vec> g(n); rep(i,0,n){ g[c[i]].insert(i); } map mp; rep(i,0,n){ auto itr = g[i].begin(); rep(j,0,g[i].size()){ mp[*itr] = {i,j}; itr++; } } vec d(n); rep(i,0,n){ d[i] = dsu(g[i].size()); } rep(i,0,m){ ll a,b; cin >> a >> b; a--;b--; if(c[a]==c[b]){ d[c[a]].merge(mp[a].S,mp[b].S); } } ll ans=0; rep(i,0,n){ if(g[i].size()==0) continue; ans+=d[i].groups().size()-1; } cout << ans << endl; }