#include<cstdio>
#include<vector>
#include<algorithm>
#include<queue>

#pragma comment(linker, "/STACK:2000000")
#define fi first
#define se second

using namespace std;

typedef pair<int,int> pii;

const int MX=(1<<30)-1;
int n,d[202020],s[202020];
int sz[202020];
pii B[202020];
int pos,rt[404040];
int ans[202020];

vector<int> v[202020],Ord;

struct node{int l,r,v;}T[13131313];

void dfs(int x, int p, int sum)
{
	s[x]=sum;
	Ord.push_back(x);
	for(auto &i : v[x])
	{
		if(i!=p) dfs(i,x,sum^d[i]);
	}
	Ord.push_back(x);
}

int sub(int x, int p)
{
	//printf("%d %d\n",x,p);
	sz[x]=1;
	for(auto &i : v[x])
	{
		if(i!=p) sz[x]+=sub(i,x);
	}
	return sz[x];
}

void pst(int p, int s, int e, int idx)
{
	T[p].v++;
	if(s==e) return;

	int mid=s+e>>1;
	if(idx<=mid)
	{
		T[++pos]=T[T[p].l];T[p].l=pos;
		pst(pos,s,mid,idx);
	}
	else
	{
		T[++pos]=T[T[p].r];T[p].r=pos;
		pst(pos,mid+1,e,idx);
	}
}

int Mxor(int p1, int p2, int s, int e, int x)
{
	if(s==e) return x^s;
	if(T[T[p2].l].v-T[T[p1].l].v==0) return Mxor(T[p1].r,T[p2].r,(s+e>>1)+1,e,x);
	if(T[T[p2].r].v-T[T[p1].r].v==0) return Mxor(T[p1].l,T[p2].l,s,s+e>>1,x);
	if((x^s)>(x^e)) return Mxor(T[p1].l,T[p2].l,s,s+e>>1,x);
	return Mxor(T[p1].r,T[p2].r,(s+e>>1)+1,e,x);
}

bool cmp(int x, int y)
{
	return sz[x]>sz[y];
}

int dfs2(int x, int p)
{
	//printf("%d %d\n",x,p);	
	ans[x]=d[x];
	for(auto &i : v[x])
	{
		if(i!=p)
		{
			ans[x]=max(ans[x],dfs2(i,x));
		}
	}

	if(v[x].size()==1) return ans[x];

	for(int i=2;i<v[x].size();i++)
	{
		queue<pii> q;
		q.push({v[x][i],x});
		while(!q.empty())
		{
			auto fro=q.front();q.pop();
			ans[x]=max(ans[x],Mxor(rt[B[v[x][1]].fi-1],rt[B[v[x][i-1]].se],0,MX,s[fro.fi]^d[x]));
			for(auto &i : v[fro.fi])
			{
				if(i!=fro.se) q.push({i,fro.fi});
			}
		}
	}
	ans[x]=max(ans[x],Mxor(rt[B[v[x][1]].fi-1],rt[B[v[x].back()].se],0,MX,s[x]^d[x]));
	return ans[x];
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&d[i]);
	for(int i=0;i<n-1;i++)
	{
		int a,b;
		scanf("%d %d",&a,&b);
		v[a].push_back(b);
		v[b].push_back(a);
	}

	v[1].push_back(0);
	v[0].push_back(1);
	sz[0]=sub(0,-1);
	for(int i=1;i<=n;i++)
	{
		sort(v[i].begin(),v[i].end(),cmp);
	}

	Ord.push_back(0);
	dfs(1,0,d[1]);

	//printf("%d %d\n",Ord[1],Ord[2]);
	for(int i=1;i<=2*n;i++)
	{
		if(!B[Ord[i]].fi) B[Ord[i]].fi=i;
		else B[Ord[i]].se=i;
		T[++pos]=T[rt[i-1]];
		rt[i]=pos;
		pst(pos,0,MX,s[Ord[i]]);
		//printf("%d\n",i);
	}

	ans[1]=dfs2(1,0);

	for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
}