#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef pair PII; typedef vector VI; typedef vector VVI; #define MP make_pair #define PB push_back #define inf 1000000007 #define mod 1000000007 #define rep(i,n) for(int i=0;i<(int)(n);++i) vector > g; vector s; int p[200010][2]; int id = 0; void dfs(int a,int pre){ s[id] = a; p[a][0] = id; id++; for(auto x:g[a]){ if(x==pre)continue; dfs(x,a); } s[id] = a; p[a][1] = id; id++; } template class segtree { private: int n,sz,h; vector node, lazy, lazyFlag; void eval(int k) { if(lazyFlag[k]){ node[k] = lazy[k]; if(k < n) { lazy[k*2] = lazy[k*2+1] = lazy[k]; lazyFlag[k*2] = lazyFlag[k*2+1] = true; } lazyFlag[k] = false; } } public: segtree(vector& v) : sz((int)v.size()), h(0){ n = 1; while(n < sz) n *= 2, h++; node.resize(2*n, numeric_limits::min()); lazy.resize(2*n); lazyFlag.resize(2*n, false); for(int i = 0; i < sz; i++) node[i+n] = v[i]; for(int i = n - 1; i >= 1; i--) node[i] = max(node[i*2],node[i*2+1]); } void range(int a, int b, T x) { a += n, b += n - 1; for(int i = h; i > 0; i--){ eval(a >> i), eval(b >> i); } int ta = a, tb = b++; while(a < b){ if(a & 1) lazy[a] = x, lazyFlag[a++] = true; if(b & 1) lazy[--b] = x, lazyFlag[b] = true; a >>= 1, b >>= 1; } while(ta >>= 1, tb >>= 1, ta){ if(!lazyFlag[ta]){ eval(2*ta), eval(2*ta+1), node[ta] = max(node[2*ta], node[2*ta+1]); } if(!lazyFlag[tb]){ eval(2*tb), eval(2*tb+1), node[tb] = max(node[2*tb], node[2*tb+1]); } } } T query(int a, int b) { if(a>=b)return 0; a += n, b += n - 1; for(int i = h; i > 0; i--) eval(a >> i), eval(b >> i); b++; T res1 = numeric_limits::min(), res2 = numeric_limits::min(); while(a < b) { if(a & 1) eval(a), res1 = max(res1, node[a++]); if(b & 1) eval(--b), res2 = max(res2, node[b]); a >>= 1, b >>= 1; } return max(res1, res2); } void print(){for(int i = 0; i < sz; i++) cout<res; void calc(int l,int r,segtree &sg,int sm){ int k = sg.query(l,r); //cerr << l << " " << r << " " << k << endl; if(k==0)return; res[k-1] = sm+1; int id = p[k][0]; while(s[id+1]!=k){ id++; int q = s[id]; calc(p[q][0],p[q][1]+1,sg,sm+1); id = p[q][1]; } sg.range(p[k][0],p[k][1]+1,0); calc(l,r,sg,sm+1); } int main(){ int n; cin >> n; s.resize(2*n); vector r(n); res.resize(n); rep(i,n) cin >> r[i]; g.resize(n+1); rep(i,n-1){ int u,v; cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } dfs(1,1); // rep(i,2*n){ // cerr << s[i] << " " ; // } // cerr << endl; segtree sg(s); calc(0,2*n,sg,0); ll ans = 1; for(int i=0;i