#include using namespace std; typedef long long ll; typedef pair pll; #define For(i, a, n) for(ll i=a;i pairoperator+(const pair&a, const pair&b){ return {a.first + b.first, a.second + b.second}; } template ostream&operator<<(ostream&os, const pair&p){ return os<<"("< basic_ostream&operator<<(basic_ostream&os, const C&c){ for(auto i=begin(c);i!=end(c);++i){ os<<(i==begin(c)?"":" ")<<*i; } return os; } template void dbg(Args&&... args){ ((cerr< in, mxp, mxs, mnp, mns, l, r; ll n; void update(ll s){ in[s] = in[s*2] + in[s*2 + 1]; in[s] %= mod; return; } public: void postav(ll vel){ n = 1; while(n < vel) n*=2; in.resize(2*n, 0); l.resize(2*n); r.resize(2*n); For(i, 0, n){ l[i+n] = r[i+n] = i; } for(ll i = n-1; i >= 1; i--){ l[i] = l[i*2]; r[i] = r[i*2 + 1]; } } void zmen(ll a, ll b){ a += n; in[a] += b; in[a] %= mod; a/=2; while(a){ update(a); a/=2; } return; } ll daj(ll a, ll b, ll s = 1){ if(a > r[s] || b < l[s]) return 0; if(a <= l[s] && r[s] <= b) return in[s]; return (daj(a, b, s*2) + daj(a, b, s*2 + 1))%mod; } }; vec> g; vec je; vec b; vec v; void dfs(ll x, ll pr = -1){ v[x] =1; for(auto i : g[x]){ if(i == pr || je[i]) continue; dfs(i, x); v[x] += v[i]; } return; } ll centroid(ll x, ll vel, ll pr = -1){ for(auto i : g[x]){ if(je[i] || i == pr) continue; if(v[i]*2 >= vel){ return centroid(i, vel, x); } } return x; } ll vys = 0; llervalac dlzka; llervalac pocet; void dfs2(ll x, vec&novy, ll mx, ll dl, ll pr = -1){ dl++; mx = max(mx, b[x]); novy.push_back({mx, dl}); for(auto i : g[x]){ if(i == pr || je[i]) continue; dfs2(i, novy, mx, dl, x); } return; } void decomp(ll x){ dfs(x); ll c = centroid(x, v[x]); vec>p; for(auto i : g[c]){ if(je[i]) continue; vec novy; dfs2(i, novy, b[c], 0, c); p.push_back(novy); } vec sumy(p.size(), 0); ll POC = 0; vec poc(p.size(), 0); For(i, 0, p.size()){ for(auto j : p[i]){ if(j.first == b[c]){ POC+=1; poc[i] += 1; sumy[i] += j.second; sumy[i] %= mod; } dlzka.zmen(j.first, j.second); pocet.zmen(j.first, 1); vys += (j.first * j.second) % mod; vys %= mod; } } For(i, 0, p.size()){ for(auto j : p[i]){ dlzka.zmen(j.first, -j.second); pocet.zmen(j.first, -1); } for(auto j : p[i]){ ll ciest = dlzka.daj(0, j.first-1); ll kolko = pocet.daj(0, j.first-1); vys += (((ciest + (kolko * j.second)%mod)%mod) * j.first) % mod; vys %= mod; } for(auto j : p[i]){ dlzka.zmen(j.first, j.second); pocet.zmen(j.first, 1); } } For(i, 0, poc.size()){ vys += ((((POC - poc[i]) * sumy[i])%mod) * b[c]) % mod; vys %= mod; } For(i, 0, p.size()){ for(auto j : p[i]){ dlzka.zmen(j.first, -j.second); pocet.zmen(j.first, -1); } } je[c] = 1; for(auto i : g[c]){ if(je[i]) continue; decomp(i); } } void solve(){ ll n; cin >> n; dlzka.postav(n); je.resize(n, 0); v.resize(n); pocet.postav(n); b.resize(n); For(i, 0, n) cin >> b[i]; g.resize(n); For(i, 0, n-1){ ll a, b; cin >> a >> b; a--;b--; g[a].push_back(b); g[b].push_back(a); } decomp(0); cout<sync_with_stdio(0); cin.exceptions(cin.failbit); ll t = 1;//cin>>t; while(t--)solve(); }