#include #include #include #include const long long MOD{998244353}; long long add(long long L, long long R) { L += R; if (L >= MOD) L -= MOD; return L; } long long inv_plus(long long v) { return (v == 0 ? 0LL : MOD - v); } long long sub(long long L, long long R) { return add(L, inv_plus(R)); } long long mult(long long L, long long R) { return (L * R) % MOD; } long long div2(long long v) { static long long inv{499122177}; assert(mult(inv, 2) == 1); return mult(v, inv); } int main() { std::cin.tie(nullptr)->sync_with_stdio(false); int N; std::cin >> N; std::vector A(N); for (auto& a : A) std::cin >> a; std::vector> g(N); for (int i{} ; i < N - 1 ; i++) { int u, v; std::cin >> u >> v; u--; v--; g[u].push_back(v); g[v].push_back(u); } std::vector dp(N); auto dfs{[&](auto dfs, int v, int p) -> long long { for (auto x : g[v]) if (x != p) { dp[v] = add(dp[v], mult(dfs(dfs, x, v), A[v])); } dp[v] = add(dp[v], A[v]); return dp[v]; }}; dfs(dfs, 0, -1); long long ans{}; auto dfs2{[&](auto dfs, int v, int p, long long propa) -> void { std::vector ch(g[v].size()); long long sum{}; for (int i{} ; i < (int)g[v].size() ; i++) { ch[i] = g[v][i] == p ? propa : dp[g[v][i]]; ch[i] = mult(ch[i], A[v]); sum = add(sum, ch[i]); } sum = add(sum, A[v]); ans = add(ans, sum); for (int i{} ; i < (int)g[v].size() ; i++) { sum = sub(sum, ch[i]); if (g[v][i] != p) dfs(dfs, g[v][i], v, sum); sum = add(sum, ch[i]); } }}; dfs2(dfs2, 0, -1, 0LL); for (auto a : A) ans = sub(ans, a); ans = div2(ans); std::cout << ans << '\n'; }