func_code_string: #include <bits/stdc++.h>   using namespace std;   const int kMod = 1e9 + 7;   const int kNmax = 2e5 + 10;   int n, v[kNmax], sub[kNmax], up[kNmax][2], down[kNmax][2], res, res_even;   vector<int> g[kNmax];   void dfs(int node, int father = 0) {     sub[node] = 1;     down[node][0] = 1;     int ways = (1LL * n * n) % kMod;     for (int vec : g[node]) {       if (vec == father) continue;       dfs(vec, node);       ways = (ways - 1LL * sub[vec] * sub[vec]) % kMod;       if (ways < 0) ways += kMod;       sub[node] += sub[vec];       down[node][0] += down[vec][1];       down[node][1] += down[vec][0];     }     ways = (ways - 1LL * (n - sub[node]) * (n - sub[node])) % kMod;     if (ways < 0) ways += kMod;     res = (res + 1LL * ways * v[node]) % kMod;     if (res < 0) res += kMod;   }   void dfs_bad(int node, int father = 0) {     int s0 = 0, s1 = 0;     int ways = (1LL * down[node][1] * (n - sub[node])) % kMod;     ways = (ways + 1LL * up[node][1] * sub[node]) % kMod;     for (int vec : g[node]) {       if (vec == father) continue;       ways = (ways + 1LL * down[vec][0] * (sub[node] - sub[vec])) % kMod;       s0 += down[vec][0];       s1 += down[vec][1];     }     res_even = (res_even + 1LL * ways * v[node]) % kMod;     if (res_even < 0) res_even += kMod;     for (int vec : g[node]) {       if (vec == father) continue;       up[vec][0] = up[node][1] + s0 - down[vec][0];       up[vec][1] = n - sub[vec] - up[vec][0];       dfs_bad(vec, node);     }   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(nullptr);     cin >> n;     for (int i = 1; i <= n; i++) cin >> v[i];     for (int i = 1, a, b; i < n; i++) {       cin >> a >> b;       g[a].push_back(b);       g[b].push_back(a);     }     dfs(1);     up[1][0] = 1;     dfs_bad(1);     res = (res - 2LL * res_even) % kMod;     if (res < 0) res += kMod;     cout << res;   }   