Advertisement
ivnikkk

Untitled

Jan 23rd, 2022
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.35 KB | None | 0 0
  1. #pragma GCC optimize("03")
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #include "bits/stdc++.h"
  4. using namespace std;
  5. using namespace chrono;
  6. #define all(a) a.begin(), a.end()
  7. #define allr(a) a.rbegin(), a.rend()
  8. #define endl "\n"
  9. mt19937 rnd(std::chrono::high_resolution_clock::now().time_since_epoch().count());
  10. typedef long long ll;
  11. typedef long double ld;
  12.  
  13. constexpr int N = 64;
  14. const int MAXN = 5e5 + 10;
  15. bitset<N> tree[4 * MAXN];
  16. bitset<N> mod[4 * MAXN];
  17. int a[MAXN];
  18. void build(ll v, ll tl, ll tr) {
  19.     if (tl == tr) {
  20.         tree[v] = a[tl];
  21.         return;
  22.     }
  23.     ll mid = (tl + tr) >> 1;
  24.     build(v << 1, tl, mid);
  25.     build((v << 1) | 1, mid + 1, tr);
  26.     tree[v] = tree[v << 1] ^ tree[(v << 1) | 1];
  27. }
  28. void push(ll v) {
  29.     tree[v] = tree[v] ^ mod[v];
  30.     if ((v << 1) | 1 > 4 * MAXN) {
  31.         mod[v] = 0;
  32.         return;
  33.     }
  34.         mod[v << 1] = mod[v << 1] ^ mod[v];
  35.         mod[(v << 1) | 1] = mod[(v << 1) | 1] ^ mod[v];
  36.         mod[v] = 0;
  37. }
  38. void update(ll v, ll tl, ll tr, ll l, ll r, ll x) {
  39.     push(v);
  40.     if (tr<l || tl>r) {
  41.         return;
  42.     }
  43.     if (tl >= l && tr <= r) {
  44.             bitset<N> sub = x;
  45.             mod[v] = mod[v] ^ sub ;
  46.         push(v);
  47.         return;
  48.     }
  49.     ll mid = (tl + tr) / 2;
  50.     update(v << 1, tl, mid, l, r, x);
  51.     update((v << 1) | 1, mid + 1, tr, l, r, x);
  52.     tree[v] = tree[v << 1] ^ tree[(v << 1) | 1];
  53. }
  54. bitset<N> get_xor(ll v, ll tl ,ll tr, ll l, ll r) {
  55.     push(v);
  56.     if (tr<l || tl>r) {
  57.         return 0;
  58.     }
  59.     if (tl >= l && tr <= r) {
  60.         return tree[v];
  61.     }
  62.     ll mid = (tl + tr) / 2;
  63.     return get_xor(v * 2, tl, mid, l, r) ^ get_xor(v * 2 + 1, mid + 1, tr, l, r);
  64. }
  65. signed main() {
  66. #ifdef _DEBUG
  67.     freopen("input.txt", "r", stdin);
  68.     freopen("output.txt", "w", stdout);
  69. #endif
  70.     ios_base::sync_with_stdio(false);
  71.     cin.tie(nullptr);
  72.     cout.tie(nullptr);
  73.     srand(time(NULL));
  74.     ll n, m;
  75.     cin >> n >> m;
  76.     for (ll i = 0; i < n; i++) {
  77.         cin >> a[i];
  78.     }
  79.     ll convert[65];
  80.     convert[0] = 1;
  81.     for (ll i = 1; i <= 64; i++) {
  82.         convert[i] = convert[i - 1] * 2;
  83.     }
  84.     build(1, 0, n - 1);
  85.     for (ll i = 0; i < m; i++) {
  86.         string s;
  87.         cin >> s;
  88.         if (s == "get") {
  89.             string xr;
  90.             cin >> xr;
  91.             if (xr == "xor") {
  92.                 ll l, r, x;
  93.                 cin >> l >> r;
  94.                 l--, r--;
  95.                 bitset<N>ans = get_xor(1, 0, n - 1, l, r);
  96.                 string mask = ans.to_string();
  97.                 reverse(all(mask));
  98.                 ll bit = 0;
  99.                 ll c = 0;
  100.                 for (ll i = 0; i < (ll)mask.size(); i++) {
  101.                     if (mask[i] == '1') {
  102.                         c += convert[i];
  103.                     }
  104.                 }/*
  105.                 ll cur = 0;
  106.                 for (ll j = l; j <= r; j++) {
  107.                     cur ^= a[j];
  108.                 }*/
  109.                 cout << c <<endl;
  110.             }
  111.         }
  112.         else if (s == "upd") {
  113.             string xr;
  114.             cin >> xr;
  115.             if (xr == "xor") {
  116.                 ll l, r, x;
  117.                 cin >> l >> r >> x;
  118.                 l--, r--;/*
  119.                 for (ll j = l; j <= r; j++) {
  120.                     a[j] ^= x;
  121.                 }*/
  122.                 update(1, 0, n - 1, l, r,x);
  123.  
  124.             }
  125.         }
  126.     }
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement