#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int n;
int a[110000];
int l[110000][16],r[110000][16];
int maxt[110000];
struct node{
	int v,n;
}le[16],ri[16];

bool cmp(node n1,node n2)
{
	if (n1.v!=n2.v) return n1.v<n2.v;
	else return n1.n<n2.n;
}

int main()
{
	int t;
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
		scanf("%d",a+i);
	for (int p=1,cnt=0;cnt<16;p<<=1,cnt++){
		t=0;
		for (int i=1;i<=n;i++)
		{
			if (p&a[i]) t=i;
			l[i][cnt]=t;
		}
		t=n+1;
		for (int i=n;i>=1;i--)
		{
			if (p&a[i]) t=i;
			r[i][cnt]=t;
		}
	}
	memset(maxt,0,sizeof(maxt));
	for (int i=1;i<=n;i++)
	{
		for (int j=0;j<16;j++) le[j].v=l[i][j],le[j].n=j;
		for (int j=0;j<16;j++) ri[j].v=r[i][j],ri[j].n=j;
		sort(le,le+16,cmp);
		sort(ri,ri+16,cmp);
		int sum1=0,sum2=0;
		for (int j=15;j>=0;j--)
		{
			if (le[j].v==0) break;
			sum1|=(1<<le[j].n);
			sum2=0;
			for (int k=0;k<16;k++)
			{
				if (ri[k].v==n+1) break;
				sum2|=(1<<ri[k].n);
				int len=ri[k].v-le[j].v+1;
				if (maxt[len]<a[i]+(sum1|sum2)) maxt[len]=a[i]+(sum1|sum2);
			}
		}
	}
	t=0;
	for (int i=1;i<=n;i++)
	{
		if (t<maxt[i]) t=maxt[i];
		printf("%d\n",t);
	}
}
