#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=5010,M=5000*5000/2;
int i,x,y,q[N];
int g1[N],g2[N],gd[N],v[M*3+N],nxt[M*3+N],ed;
int cnt,dfn[N],id[N],fa[N],f[N],mn[N],sd[N],idom[N];
int a[5010],ans[5010],dp[5010],n;
bool vis[5010];
void add(int *g,int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
int F(int x)
{
	if (f[x]==x)return x;
	int y=F(f[x]);
	if (sd[mn[x]]>sd[mn[f[x]]])mn[x]=mn[f[x]];
	return f[x]=y;
}
void dfs(int x)
{
	id[dfn[x]=++cnt]=x;
	for(int i=g1[x];i;i=nxt[i])if(!dfn[v[i]])dfs(v[i]),fa[dfn[v[i]]]=dfn[x];
}
void tarjan(int S)
{
	int i,j,k,x;
	for(cnt=0,i=1;i<=n;i++)gd[i]=dfn[i]=id[i]=fa[i]=idom[i]=0,f[i]=sd[i]=mn[i]=i;
	dfs(S);
	for(i=n;i>1;i--)
	{
		for(j=g2[id[i]];j;j=nxt[j])F(k=dfn[v[j]]),sd[i]=sd[i]<sd[mn[k]]?sd[i]:sd[mn[k]];
		add(gd,sd[i],i);
		for(j=gd[f[i]=x=fa[i]];j;j=nxt[j])F(k=v[j]),idom[k]=sd[mn[k]]<x?mn[k]:x;
		gd[x]=0;
	}
	for(i=2;i<=n;add(gd,idom[i],i),i++)if(idom[i]!=sd[i])idom[i]=idom[idom[i]];
}
int main()
{
	for(;scanf("%d",&n)>0;)
	{
		n++;
		for(ed=0,i=1;i<=n;i++)g1[i]=g2[i]=0;
		for(int i=1;i<n;i++)scanf("%d",&a[i]);
		for(int i=1;i<n;i++)
		{
			dp[i]=1;
			for(int j=1;j<i;j++)
			if(a[j]<a[i])
			dp[i]=max(dp[i],dp[j]+1);
			for(int j=1;j<i;j++)
			if(a[j]<a[i]&&dp[j]+1==dp[i])
			{
				add(g1,j,i);
				add(g2,i,j);
			}
			if(dp[i]==1)
			{
				add(g1,n,i);
				add(g2,i,n);
			}
		}
		tarjan(n);
		for(int i=1;i<n;i++)ans[i]=0;
		for(int i=1;i<n;i++)
		{
			for(int j=1;j<n;j++)vis[j]=0;
			for(int p=id[idom[dfn[i]]];p!=n;p=id[idom[dfn[p]]])vis[p]=1;
			for(int j=1;j<n;j++)
			if(i!=j)
			{
				if(vis[j])ans[j]^=(dp[i]-1)*(dp[i]-1);
				else ans[j]^=dp[i]*dp[i];
			}
		}
		for(int i=1;i<n;i++)printf("%d%c",ans[i],i==n-1?'\n':' ');
	}
}
