#include #include using i64 = long long; struct Dsu { int n; std::vector f, sz; Dsu() {} Dsu(int _n) : n(_n) { f.resize(n); std::iota(f.begin(), f.end(), 0); sz.assign(n, 1); } int leader(int x) { if (f[x] == x) return x; return f[x] = leader(f[x]); } void merge(int u, int v) { u = leader(u), v = leader(v); if (u == v) return; if (sz[u] < sz[v]) { std::swap(u, v); } f[v] = u; sz[u] += sz[v]; } bool same(int u, int v) { return leader(u) == leader(v); } int size(int x) { return sz[leader(x)]; } }; void solve() { int n, m; std::cin >> n >> m; std::vector color(n); int ans = 0; for (auto &i : color) { std::cin >> i; i--; } std::vector> adj(n); for (int i = 0; i < m; i++) { int u, v; std::cin >> u >> v; --u, --v; adj[u].push_back(v); adj[v].push_back(u); } Dsu dsu(n); for (int i = 0; i < n; i++) { if (adj[i].empty()) continue; for (const auto &j : adj[i]) { if (color[i] == color[j]) { dsu.merge(i, j); } } } std::vector> id(n); for (int i = 0; i < n; i++) { id[color[i]].push_back(i); } for (const auto &v : id) { if (v.size() <= 1) { continue; } int x = v.front(); for (size_t i = 1; i < v.size(); i++) { int y = v[i]; if (!dsu.same(x, y)) { ans++; dsu.merge(x, y); } } } std::cout << ans << '\n'; } int main() { std::cin.tie(nullptr)->sync_with_stdio(false); solve(); return 0; }