#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <set>
#define NMAX 200005
#define LMAX (1<<16)
#define pii pair <int,int>
#define pb push_back
#define mp make_pair
#define f first
#define s second
# define verf ++poz == LMAX ? fread ( ch, 1, LMAX, stdin ), poz = 0 : 0
using namespace std;
int n,B[NMAX],dad[NMAX],st[NMAX],dr[NMAX],r,best[NMAX],E[NMAX],ap[NMAX],poz,act,rez;
vector <int> A[NMAX],C[NMAX];
vector < pair <pii,int> > D[NMAX],F[NMAX];
set <pii> H,G;
set <pii> :: iterator it;
char viz[NMAX],ch[LMAX];
inline int cif(char x)
{
return x>='0' && x<='9';
}
inline void citeste ( int &x )
{
int semn = 1;
if ( ch[0] == '\0' )
fread ( ch, 1, LMAX, stdin ) ;
else
for ( ; (ch[poz] < '0' || ch[poz] > '9') && ch[poz] != '-' ; verf ) ;
for ( x = 0 ; (ch[poz] >= '0' && ch[poz] <= '9') || ch[poz] == '-'; (ch[poz] == '-' ? semn = -1 : x = x * 10 + ch[poz] - '0'), verf ) ;
x *= semn;
}
void read()
{
scanf("%d",&n);
int i,x,y,semn,poz=0;
for (i=1; i<n; i++)
{
scanf("%d%d",&x,&y);
A[x].pb(y);
A[y].pb(x);
}
for (i=1; i<=n; i++)
citeste(B[i]);
}
void dfs(int nod)
{
viz[nod]=1;
st[nod]=++r;
it=H.lower_bound(mp(B[nod],0));
if (it!=H.end())
C[(*it).s].pb(nod);
H.insert(mp(B[nod],nod));
int i,vec;
for (i=0; i<A[nod].size(); i++)
{
vec=A[nod][i];
if (!viz[vec])
dfs(vec);
}
H.erase(mp(B[nod],nod));
dr[nod]=r;
}
void prepare()
{
int i,j,vec;
for (i=1; i<=n; i++)
{
for (j=0; j<C[i].size(); j++)
{
vec=C[i][j];
D[i].pb(mp(mp(st[vec],dr[vec]),vec));
F[i].pb(mp(mp(dr[vec],st[vec]),vec));
}
sort(D[i].begin(),D[i].end());
sort(F[i].begin(),F[i].end());
}
}
inline int max(int x,int y)
{
return x>y ? x : y;
}
void dfs2(int nod)
{
viz[nod]=1;
int i,j,vec,vec2;
for (i=0; i<A[nod].size(); i++)
{
vec=A[nod][i];
if (!viz[vec])
dfs2(vec);
}
poz=-1; act=0;
for (i=0; i<D[nod].size(); i++)
{
vec=D[nod][i].s;
ap[vec]=i;
E[i]=0;
}
for (i=0; i<D[nod].size(); i++)
{
vec=D[nod][i].s;
while (poz+1<F[nod].size() && F[nod][poz+1].f.f<st[vec])
{
poz++;
act=max(act,E[ap[F[nod][poz].s]]);
}
E[i]=act+best[vec];
}
for (i=0; i<D[nod].size(); i++)
best[nod]=max(best[nod],E[i]);
best[nod]++;
}
void find_sol()
{
int i;
for (i=1; i<=n; i++)
rez=max(rez,best[i]);
}
int main()
{
freopen("guvern.in","r",stdin);
freopen("guvern.out","w",stdout);
read();
dfs(1);
prepare();
memset(viz,0,sizeof(viz));
dfs2(1);
find_sol();
printf("%d\n",rez);
return 0;
}