#include #define ll long long #define INF 1000000005 #define MOD 1000000007 #define EPS 1e-10 #define rep(i,n) for(int i=0;i<(int)(n);++i) #define rrep(i,n) for(int i=(int)(n)-1;i>=0;--i) #define srep(i,s,t) for(int i=(int)(s);i<(int)(t);++i) #define each(a,b) for(auto& (a): (b)) #define all(v) (v).begin(),(v).end() #define len(v) (int)(v).size() #define zip(v) sort(all(v)),v.erase(unique(all(v)),v.end()) #define cmx(x,y) x=max(x,y) #define cmn(x,y) x=min(x,y) #define fi first #define se second #define pb push_back #define show(x) cout<<#x<<" = "<<(x)<auto&operator<<(ostream&o,pairp){return o<<"{"<auto&operator<<(ostream&o,sets){for(auto&e:s)o< auto&operator<<(ostream&o,priority_queueq){while(!q.empty())o<auto&operator<<(ostream&o,mapm){for(auto&e:m)o<auto&operator<<(ostream&o,vectorv){for(auto&e:v)o<void ashow(T t,A...a){cout< P; typedef pair pll; typedef vector vi; typedef vector vl; typedef vector vvi; typedef vector vvl; typedef vector

vp; typedef vector vd; typedef vector vs; const int MAX_N = 200005; template class segtree { private: int n,sz; vector node; public: segtree(vector& v){ sz = (int)v.size(); n = 1; while(n < sz){ n *= 2; } node.assign(2*n,numeric_limits::min()); rep(i,sz){ node[i+n] = v[i]; } for(int i=n-1; i>=1; i--){ node[i] = max(node[2*i],node[2*i+1]); } } void update(int k,T a) { node[k+=n] = a; while(k>>=1){ node[k] = max(node[2*k],node[2*k+1]); } } T query(int a,int b) { T res1 = numeric_limits::min(); T res2 = numeric_limits::min(); a += n, b += n; while(a != b){ if(a % 2) res1 = max(res1, node[a++]); if(b % 2) res2 = max(res2, node[--b]); a >>= 1, b>>= 1; } return max(res1, res2); } void print() { rep(i,sz){ cout << query(i,i+1) << " "; } cout << endl; } }; vector G[MAX_N], ord; int r[MAX_N], in[MAX_N], out[MAX_N], ans[MAX_N]; void dfs(int u, int p) { in[u] = len(ord); ord.pb(u); each(v, G[u]){ if(v != p) dfs(v, u); } out[u] = len(ord); } void rec(int u, int p, int val, segtree& sg){ for(;;val++){ int ver = sg.query(in[u], out[u]); if(ver == -INF) break; ans[ver] = val + 1; each(nx, G[ver]){ if(in[nx] > in[ver]) rec(nx, ver, val + 1, sg); } sg.update(in[ver], -INF); } } int main() { cin.tie(0); ios::sync_with_stdio(false); int n; cin >> n; rep(i,n){ cin >> r[i]; } rep(i,n-1){ int u, v; cin >> u >> v; G[u-1].pb(v-1), G[v-1].pb(u-1); } dfs(0, -1); segtree sg(ord); rec(0, -1, 0, sg); int score = 1; rep(i,n){ score = (ll)score * (r[i] + ans[i]) % MOD; } cout << score << "\n"; return 0; }