structnode{typedeflonglongint ll;
ll b[65], p[65];int cnt, flag;node(){memset(p,0,sizeof(p));memset(b,0,sizeof(b));
cnt = flag =0;}//在线性基中插入一个元素boolinsert(ll x){for(int i =62; i >=0; i--){if(x &(1LL<< i)){if(b[i]){
x ^= b[i];}else{
b[i]= x;returntrue;}}}
flag =1;returnfalse;}//求异或最大值,即从高位向低位扫,若是能使答案更大就异或上该位的值
ll qmax(){
ll res =0;for(int i =62; i >=0; i--){if((res ^ b[i])> res) res ^= b[i];}return res;}//若是以前的插入出现了0,则返回0,不然返回线性基中最小的值
ll qmin(){if(flag)return0;for(int i =0; i <=62; i++){if(b[i])return b[i];}return0;}//重构线性基,目的是为了求异或第k小的数voidrebuild(){for(int i =62; i >=1; i--){if(b[i]){for(int j = i -1; j >=0; j--){if(b[i]&(1LL<< j)) b[i]^= b[j];}}}for(int i =0; i <=62; i++){if(b[i]) p[cnt++]= b[i];}}//异或第k小,重构以后的线性基第i位对名次的贡献即为(1 << i),从低到高看看k的二进制位第i位是否为1,若为1则要异或上i为的值
ll kth(ll k){if(flag)--k;if(k ==0)return0;
ll res =0;if(k >=(1LL<< cnt))return-1;for(int i =0; i < cnt; i++){if(k &(1LL<< i)) res ^= p[i];}return res;}};