#include <bits/stdc++.h>
using namespace std;
const int MAXN=50000+5;
int n;
vector <int> vec[MAXN];
int val[MAXN];// 存树
int a[MAXN];
int son[MAXN],fa[MAXN];
int siz[MAXN],dep[MAXN],top[MAXN];
void dfs1(int x,int f){
dep[x]=dep[f]+1;siz[x]=1;fa[x]=f;
for(auto to:vec[x]){
if(to==f) continue;
dfs1(to,x);
siz[x]+=siz[to];
if(siz[to]>siz[son[x]]) son[x]=to;
}
}
void dfs2(int x,int tp){
if(son[x]==0) return;
top[x]=tp;
dfs2(son[x],tp);
for(auto to:vec[x]){
if(to==fa[x]||to==son[x]) continue;
dfs2(to,to);
}
}
int LCA(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
x=fa[top[x]];
}
if(dep[x]<dep[y]) return x;
return y;
}
void dfs3(int x){
for(auto to:vec[x]){
if(to==fa[x]) continue;
dfs3(to);
val[x]+=val[to];
}
}
int main(){
cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
}
for(int i=1,x,y;i<n;i++){
cin >> x >> y;
vec[x].push_back(y);
vec[y].push_back(x);
}
dfs1(1,0);
dfs2(1,1);
for(int i=1;i<=n-1;i++){
int lca=LCA(a[i],a[i+1]);
val[a[i]]++,val[a[i+1]]++;
val[lca]--,val[fa[lca]]--;
}
dfs3(1);
for(int i=1;i<=n;i++) cout << val[i];
}
树刨+LCA+差分 不知道哪里错了。