#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll d[100];
void add(ll x)
{
for(int i=60;i>=0;i--)
{
if(x&(1ll<<i))//注意,如果i大于31,前面的1的后面一定要加ll
{
if(d[i])x^=d[i];
else
{
d[i]=x;
break;//插入成功就退出
}
}
}
}
//求在一个序列中,取若干个数,使得它们的异或和最大
ll ans()
{
ll anss=0;
for(int i=60;i>=0;i--)//记得从线性基的最高位开始
if((anss^d[i])>anss)anss^=d[i];
return anss;
}
//求在一个序列中,取若干个数,使得它们的异或和最小
//要看一看有没有元素不能插入线性基,如果有,那么最小值就是 0,否则依然是最小的d[i]
//从一个序列中取任意个元素进行异或,求能异或出的所有数字中第k小的那个。
void work()//处理线性基
{
for(int i=1;i<=60;i++)
for(int j=1;j<=i;j++)
if(d[i]&(1ll<<(j-1)))d[i]^=d[j-1];
}
ll k_th(ll k)
{
if(k==1&&tot<n)return 0;//特判一下,假如k=1,并且原来的序列可以异或出0,就要返回0,tot表示线性基中的元素个数,n表示序列长度
if(tot<n)k--;//类似上面,去掉0的情况,因为线性基中只能异或出不为0的解
work();
ll ans=0;
for(int i=0;i<=60;i++)
if(d[i]!=0)
{
if(k%2==1)ans^=d[i];
k/=2;
}
}
int main(){
int n;scanf("%d",&n);
//构造线性基序列b
for(int i=0;i<n;i++){
ll x;
scanf("%lld",&x);
add(x);
}
return 0;
}