线性基求交

struct lb{
	ll p[63];
	lb(){
        memset(p,0,sizeof(p));
	}
	void clear(){
		memset(p,0,sizeof(p));
	}
	void ins(ll x){
		for(int i=60;i>=0;i--) if((x>>i)&1){
			if(!p[i]){
				p[i]=x;
				return;
			}else x^=p[i];
		}
	}
};
lb merge(lb a,lb b){
	lb g=lb(),tmp=a;
	ll cur,d;
	for(int i=0;i<=60;i++) if(b.p[i]){
		cur=0,d=b.p[i];
		for(int j=i;j>=0;j--) if(d>>j&1){
			if(tmp.p[j]){
				d^=tmp.p[j],cur^=a.p[j];
				if(d) continue;
				g.p[i]=cur;
			}else tmp.p[j]=d,a.p[j]=cur;
			break;
		}
	}
	return g;
}