Beingamanforever

Div3F

Nov 2nd, 2024 (edited)
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.02 KB | None | 0 0
  1.  
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. mt19937_64 RNG(chrono::steady_clock::now().time_since_epoch().count());
  5. #define NeedForSpeed                  \
  6.     ios_base::sync_with_stdio(false); \
  7.     cin.tie(NULL);                    \
  8.     cout.tie(NULL);
  9. #define int long long
  10. #define all(x) (x).begin(), (x).end()
  11. typedef vector<int> vi;
  12. typedef vector<bool> vb;
  13. typedef vector<vi> vvi;
  14. typedef vector<pair<int, int>> vpi;
  15. #define f first
  16. #define s second
  17. const int mod = 1000000007;
  18.  
  19. int findXOR(int n)
  20. {
  21.     int mod = n % 4;
  22.     if (mod == 0)
  23.         return n;
  24.     else if (mod == 1)
  25.         return 1;
  26.     else if (mod == 2)
  27.         return n + 1;
  28.     else
  29.         return 0;
  30. }
  31.  
  32. int findXOR(int l, int r)
  33. {
  34.     return findXOR(l - 1) ^ findXOR(r);
  35. }
  36.  
  37. void solve()
  38. {
  39.     int l, r, i, k;
  40.     cin >> l >> r >> i >> k;
  41.     if (i == 0)
  42.     {
  43.         cout << 0 << endl;
  44.         return;
  45.     }
  46.     int step = 1LL << i;
  47.     int leftmod = l % (1LL << i);
  48.     int firstocc = l + (k - leftmod);
  49.     if (firstocc < l)
  50.     {
  51.         firstocc += (1LL << i);
  52.     }
  53.     int rightmod = r % (1LL << i);
  54.     int lastocc = r + (k - rightmod);
  55.     if (lastocc > r)
  56.     {
  57.         lastocc -= (1LL << i);
  58.     }
  59.     // edge case when only 1 element occurs in the range
  60.     if (firstocc > r || lastocc < l)
  61.     {
  62.         if ((firstocc != lastocc))
  63.         {
  64.             cout << ((findXOR(l - 1) ^ findXOR(r))) << endl;
  65.             return;
  66.         }
  67.         else
  68.         {
  69.             cout << ((findXOR(l - 1) ^ findXOR(r)) ^ k) << endl;
  70.             return;
  71.         }
  72.     }
  73.     int start = 0;
  74.     if (l - k > 0)
  75.     {
  76.         start = ((l - k) + step - 1) / step;
  77.     }
  78.     int end = max(0LL, (r - k) / step);
  79.     int XOR = (findXOR(start - 1) ^ findXOR(end)) << i;
  80.     if ((end - start + 1) % 2 == 1)
  81.     {
  82.         XOR ^= k;
  83.     }
  84.     cout << (findXOR(l - 1) ^ findXOR(r) ^ XOR) << endl;
  85. }
  86.  
  87. signed main()
  88. {
  89.     NeedForSpeed;
  90.     int t;
  91.     cin >> t;
  92.     while (t--)
  93.         solve();
  94.     return 0;
  95. }
  96.  
Advertisement
Add Comment
Please, Sign In to add comment