#include using namespace std; class UnionFind{ private: vector par,siz; public: UnionFind(int N){ par.resize(N,-1); siz.resize(N,1); } int root(int x){ //連結成分の代表頂点を返す. if(par.at(x) == -1) return x; else return par.at(x) = root(par.at(x)); } bool unite(int u, int v){ //u,vを連結する 連結してた->false,した->trueを返す. u = root(u),v = root(v); if(u == v) return false; if(siz.at(u) < siz.at(v)) swap(u,v); //Union by size. par.at(v) = u; siz.at(u) += siz.at(v); return true; } bool issame(int u, int v){ //同じ連結成分ならtrue. if(root(u) == root(v)) return true; else return false; } int size(int pos){return siz.at(root(pos));} //posの連結成分の大きさを返す. }; long long solve(long long N,long long M){ vector V(N); iota(V.begin(),V.end(),M); vector> edge; for(int i=0; i> T; while(T--){ long long N,M; cin >> N >> M; long long p2 = 1; long long answer = 0; for(int d=1; d<34; d++){ long long d2 = 1LL<>= 1; if((L&d2) != (R&d2)){ answer += d2,L %= d2,R %= d2; while(L > R){ d2 >>= 1; if((L&d2) != (R&d2)) answer += d2; L %= d2,R %= d2; } } break; } answer += (r-l-1)*(d2>>1); L = M,R = (l+1)*d2-1; if((L&(d2>>1)) != (R&(d2>>1))) answer += (d2>>1); L = r*d2,R = M+N-1; if((L&(d2>>1)) != (R&(d2>>1))) answer += (d2>>1); } cout << answer << "\n"; } }