struct linearbasis {
ll base[64], flag, cnt;
void add(ll x) {
for(int i = 62; ~i; i--) {
if(x >> i & 1) {
if(!base[i]) {
base[i] = x;
return ;
}
x ^= base[i];
}
}
flag = 1;
}
ll query_max() {
ll ans = 0;
for(int i = 62; ~i; i--) {
if((ans ^ base[i]) > ans) {
ans ^= base[i];
}
}
return ans;
}
ll query_min() {
for(int i = 0; i <= 62; i++) {
if(base[i]) {
return base[i];
}
}
}
void rebuild() {
cnt = 0;
for(int i = 62; i >= 0; i--) {
for(int j = i - 1; j >= 0; j--) {
if(base[i] >> j & 1) {
base[i] ^= base[j];
}
}
}
for(int i = 0; i <= 62; i++) {
if(base[i]) {
ll temp = base[i];
base[i] = 0;
base[cnt++] = temp;
}
}
}
ll query_k(ll k) {
k -= flag;
if(k == 0) return 0;
if(k >= 1ll << cnt) return -1;
ll ans = 0;
for(int i = 62; ~i; i--) {
if(k >> i & 1) {
ans ^= base[i];
}
}
return ans;
}
void init() {
memset(base, 0, sizeof base), flag = cnt = 0;
}
}a;