// #ifdef NACHIA // #define _GLIBCXX_DEBUG // #else // #define NDEBUG // #endif #include #include #include #include using i64 = long long; using u64 = unsigned long long; #define rep(i,n) for(int i=0; i void chmin(A& l, const A& r){ if(r < l) l = r; } template void chmax(A& l, const A& r){ if(l < r) l = r; } #include using Modint = atcoder::static_modint<998244353>; using namespace std; #include #include namespace nachia{ int Popcount(unsigned long long c) noexcept { #ifdef __GNUC__ return __builtin_popcountll(c); #else c = (c & (~0ull/3)) + ((c >> 1) & (~0ull/3)); c = (c & (~0ull/5)) + ((c >> 2) & (~0ull/5)); c = (c & (~0ull/17)) + ((c >> 4) & (~0ull/17)); c = (c * (~0ull/257)) >> 56; return c; #endif } // please ensure x != 0 int MsbIndex(unsigned long long x) noexcept { #ifdef __GNUC__ return 63 - __builtin_clzll(x); #else using u64 = unsigned long long; int q = (x >> 32) ? 32 : 0; auto m = x >> q; constexpr u64 hi = 0x8888'8888; constexpr u64 mi = 0x1111'1111; m = (((m | ~(hi - (m & ~hi))) & hi) * mi) >> 35; m = (((m | ~(hi - (x & ~hi))) & hi) * mi) >> 31; q += (m & 0xf) << 2; q += 0x3333'3333'2222'1100 >> (((x >> q) & 0xf) << 2) & 0xf; return q; #endif } // please ensure x != 0 int LsbIndex(unsigned long long x) noexcept { #ifdef __GNUC__ return __builtin_ctzll(x); #else return MsbIndex(x & -x); #endif } } namespace nachia{ template struct RectangleSum{ private: struct BitVectorRank { using u64 = std::uint64_t; using u32 = std::uint32_t; std::vector> a; BitVectorRank(const std::vector& b = {}){ int n = b.size(); a.assign(n/64 + 1, std::make_pair((u64)0, (u32)0)); auto p = b.begin(); u32 sum = 0; u64 tmp = 0; for(int i=0; i<=n; i+=64){ tmp = 0; int maxd = std::min(n - i, 64); for(int d=0; d> 6]; return (u32)(Popcount(b & ~(~u64(0) << (i & 63)))) + s; } bool get(std::uint32_t i) const { return (a[i >> 6].first >> (i & 63)) & 1; } }; int n; int N; int logN; std::vector Xsorted; std::vector Ysorted; std::vector rankX; std::vector> ds; std::vector Z; std::vector L; Val ZERO; void construct(const std::vector, Val>>& val){ n = val.size(); std::vector> pos(n); for(int i=0; i sortIY(n); for(int i=0; i sortIX(n); rankX.resize(n); for(int i=0; i(n+1, ZERO)); L.resize(logN); Z.resize(logN); std::vector Idx = sortIY; for(int k=0; k=0; i--){ std::vector Lbuf(n,0); std::vector preIdx(n); std::swap(preIdx, Idx); int z = ((n >> (i+1)) << i) + std::min(1<, Val>>& val, Val Zero) : ZERO(Zero) { construct(val); } RectangleSum(const std::vector>& points, const std::vector& vals, Val Zero) : ZERO(Zero) { n = vals.size(); std::vector, Val>> buf; for(int i=0; i= xr || yl >= yr) return ans; struct Search{ int i, xa, xb, ys, yt; }; std::vector Q; Q.reserve((logN+1)*2); Q.push_back({ logN,0,n,yl,yr }); for(int i=0; i<(int)Q.size(); i++){ auto p = Q[i]; if(p.xa == p.xb) continue; if(xl <= p.xa && p.xb <= xr){ ans += ds[p.i][p.yt] - ds[p.i][p.ys]; continue; } p.i--; int nxs = L[p.i].rank(p.ys), nxt = L[p.i].rank(p.yt); int xm = p.xa+(1<=1; ){ if(xa == xb) break; i--; int nxs = L[i].rank(ys), nxt = L[i].rank(yt); int xm = xa + (1< namespace nachia{ namespace prime_sieve_explicit_internal{ std::vector isprime = { false }; // a[x] := isprime(2x+1) void CalcIsPrime(int z){ if((int)isprime.size() *2+1 < z+1){ int new_z = isprime.size(); while(new_z*2+1 < z+1) new_z *= 2; z = new_z-1; isprime.resize(z+1, true); for(int i=1; i*(i+1)*2<=z; i++) if(isprime[i]){ for(int j=i*(i+1)*2; j<=z; j+=i*2+1) isprime[j] = false; } } } std::vector prime_list = {2}; int prime_list_max = 0; void CalcPrimeList(int z){ while((int)prime_list.size() < z){ if((int)isprime.size() <= prime_list_max + 1) CalcIsPrime(prime_list_max * 2 + 10); for(int p=prime_list_max+1; p<(int)isprime.size(); p++){ if(isprime[p]) prime_list.push_back(p*2+1); } prime_list_max = isprime.size() - 1; } } void CalcPrimeListUntil(int z){ if(prime_list_max < z){ CalcIsPrime(z); for(int p=prime_list_max+1; p<(int)isprime.size(); p++){ if(isprime[p]) prime_list.push_back(p*2+1); } prime_list_max = isprime.size() - 1; } } } bool IsprimeExplicit(int n){ using namespace prime_sieve_explicit_internal; if(n == 2) return true; if(n % 2 == 0) return false; CalcIsPrime(n); return isprime[(n-1)/2]; } int NthPrimeExplicit(int n){ using namespace prime_sieve_explicit_internal; CalcPrimeList(n); return prime_list[n]; } int PrimeCountingExplicit(int n){ using namespace prime_sieve_explicit_internal; if(n < 2) return 0; CalcPrimeListUntil(n); auto res = std::upper_bound(prime_list.begin(), prime_list.end(), n) - prime_list.begin(); return (int)res; } // [l, r) std::vector SegmentedSieveExplicit(long long l, long long r){ assert(0 <= l); assert(l <= r); long long d = r - l; if(d == 0) return {}; std::vector res(d, true); for(long long p=2; p*p<=r; p++) if(IsprimeExplicit(p)){ long long il = (l+p-1)/p, ir = (r+p-1)/p; if(il <= p) il = p; for(long long i=il; i void DivisorZeta(std::vector& a){ int n = a.size() - 1; for(int d=2; d<=n; d++) if(IsprimeExplicit(d)) for(int i=1; i*d<=n; i++) a[i*d] += a[i]; } template void DivisorReversedZeta(std::vector& a){ int n = a.size() - 1; for(int d=2; d<=n; d++) if(IsprimeExplicit(d)) for(int i=n/d; i>=1; i--) a[i] += a[i*d]; } template void DivisorMobius(std::vector& a){ int n = a.size() - 1; for(int d=2; d<=n; d++) if(IsprimeExplicit(d)) for(int i=n/d; i>=1; i--) a[i*d] -= a[i]; } template void DivisorReversedMobius(std::vector& a){ int n = a.size() - 1; for(int d=2; d<=n; d++) if(IsprimeExplicit(d)) for(int i=1; i*d<=n; i++) a[i] -= a[i*d]; } template std::vector GcdConvolution(std::vector a, std::vector b){ assert(a.size() == b.size()); assert(1 <= a.size()); DivisorReversedZeta(a); DivisorReversedZeta(b); for(int i=1; i<(int)a.size(); i++) a[i] *= b[i]; DivisorReversedMobius(a); return a; } template std::vector LcmConvolution(std::vector a, std::vector b){ assert(a.size() == b.size()); assert(1 <= a.size()); DivisorZeta(a); DivisorZeta(b); for(int i=1; i<(int)a.size(); i++) a[i] *= b[i]; DivisorMobius(a); return a; } template void SumForCoprimeIndex(std::vector& f){ if((int)f.size() <= 1) return; Elem q = f[1]; for(int i=2; i<(int)f.size(); i++) q += f[i]; std::vector F(f.size()); F[1] = -1; DivisorMobius(F); DivisorReversedZeta(f); f[1] -= f[1]; Elem t = f[1]; for(int i=2; i<(int)f.size(); i++){ if(F[i] == 0) f[i] = f[1]; if(F[i] == -1){ t = f[1]; t -= f[i]; f[i] = t; } } DivisorZeta(f); for(int i=1; i<(int)f.size(); i++){ t = q; t -= f[i]; f[i] = t; } } } // namespace nachia void testcase(){ int Z = 200000; vector Q(Z+1); for(int i=1; i<=Z; i++) Q[i] = i-1; nachia::DivisorMobius(Q); vector> pos; vector weight; vector, i64>> pw; for(int p=2; p<=Z; p++) for(int q=2; q*p<=Z; q++){ pos.push_back({ p*q-p, p*q }); weight.push_back(Q[p]); pw.push_back({ pos.back(), weight.back() }); } auto md = nachia::RectangleSum(pw, 0); int T; cin >> T; i64 ansxor = 0; rep(t,T){ i64 l,r; cin >> l >> r; l ^= ansxor; r ^= ansxor; i64 s = md.sum(l, r+1, l, r+1); i64 ans = r*(r-1)/2 - (l-1)*(l-2)/2 - s; ansxor = ans; cout << ans << '\n'; } } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); testcase(); return 0; }