#include #include #include #include using namespace std; #include #include #include template struct binarytrie{ using Bit=typename conditional::type; struct node{ long val; arraynxt; node():val(0L),nxt({-1,-1}){} }; vectorv; binarytrie(){v.emplace_back();} int nxt(int u,int i) { if(v[u].nxt[i]==-1) { v[u].nxt[i]=v.size(); v.emplace_back(); } return v[u].nxt[i]; } void range_add(Bit a,Bit r,long w) { assert(0<=a&&(a>>sz)==0); if(r==((Bit)1<>sz)==0); int p=0; for(int i=sz;i--;) { int t=a>>i&1; if(r>>i&1) { v[nxt(p,t)].val+=w; p=nxt(p,1-t); } else p=nxt(p,t); } v[p].val+=w; } long get_min(int u) { long ret=1e18; for(int t:v[u].nxt)ret=min(ret,t==-1?0L:get_min(t)); ret+=v[u].val; return ret; } long get_min(){return get_min(0);} }; int N,M; int R[50505],C[50505]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T;cin>>T; for(;T--;) { cin>>N>>M; for(int i=0;i>R[i]; for(int i=0;i>C[i]; vector >A(N,vector(M)); for(int i=0;i>A[i][j]; {//check bool ok=true; for(int i=0;iBT; long inf=1e9; for(int j=0;j>v)v++; BT.range_add(A[0][j],1<<30,inf); BT.range_add(A[0][j],(1<>v)v++; BT.range_add(A[0][0]^A[i][0],1<<30,inf); BT.range_add(A[0][0]^A[i][0],(1<