#include #include "testlib.h" using ll = long long; const ll MIN_N = 2, MAX_N = 200'000; const ll MIN_A = 0, MAX_A = 1'000'000'000; namespace ebi { struct unionfind { private: std::vector par; public: unionfind(int n = 0) : par(n, -1) {} bool same(int x, int y) { return leader(x) == leader(y); } bool merge(int x, int y) { x = leader(x); y = leader(y); if (x == y) return false; if (par[x] > par[y]) std::swap(x, y); par[x] += par[y]; par[y] = x; return true; } int leader(int x) { if (par[x] < 0) return x; else return par[x] = leader(par[x]); } int size(int x) { return -par[leader(x)]; } int count_group() { int c = 0; for (int i = 0; i < int(par.size()); i++) { if (par[i] < 0) c++; } return c; } void clear() { for (int i = 0; i < int(par.size()); i++) { par[i] = -1; } } }; } // namespace ebi int main() { registerValidation(); ll n = inf.readLong(MIN_N, MAX_N); inf.readEoln(); for(int i: std::views::iota(0, n)) { inf.readLong(MIN_A, MAX_A); if(i < n-1) { inf.readSpace(); } else { inf.readEoln(); } } ebi::unionfind uf(n); for(int i_: std::views::iota(0, n-1)) { int u = inf.readLong(1ll, n) - 1; inf.readSpace(); int v = inf.readLong(1ll, n) - 1; inf.readEoln(); uf.merge(u, v); } ensure(uf.size(0) == n); inf.readEof(); return 0; }