Submission #1177773

#TimeUsernameProblemLanguageResultExecution timeMemory
1177773Mousa_AboubakerXORanges (eJOI19_xoranges)C++20
100 / 100
91 ms11248 KiB
#pragma GCC optimize("O3", "Ofast", "unroll-loops")
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <deque>
#include <climits>
#include <cmath>
#include <numeric>
#include <string>
#include <bitset>
#include <assert.h>
#include <iomanip>
using namespace std;

template <typename T>
using pqg = priority_queue<T, vector<T>, greater<T>>;

// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;

// template <typename T>
// using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

// #include <bits/stdc++.h>
// mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
// #define getrand(l, r) uniform_int_distribution<int>(l, r)(rng)

const long long infl = 1e18 + 1;
const int inf = 1e9 + 1;
const int mod1 = 1e9 + 7;
const int mod2 = 998244353;
const long double eps = 1e-7;
const int mod = mod2;

int add(int a, int b) { return (a + b) % mod; }
int sub(int a, int b) { return (a - b + mod) % mod; }
int mul(int a, int b) { return (int)((long long)a * b % mod); }
int pwr(int a, int b = mod - 2)
{
  int res = 1;
  for (; b > 0; b >>= 1, a = mul(a, a))
    if (b & 1)
      res = mul(res, a);
  return res;
}
template <typename T>
bool chmax(T &a, T b)
{
  if (b > a)
  {
    a = b;
    return true;
  }
  return false;
}
template <typename T>
bool chmin(T &a, T b)
{
  if (b < a)
  {
    a = b;
    return true;
  }
  return false;
}

#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define SZ(x) (int)x.size()
#define vec vector
#define dbg(x) cout << (#x) << " : " << x << endl;
using ll = long long;
using ull = unsigned long long;

template <typename T>
struct FenwickTree
{
  int n;
  vec<T> fen;
  FenwickTree(int _n)
  {
    n = _n;
    fen.assign(n + 1, 0);
  }
  FenwickTree(vec<T> _a)
  {
    n = SZ(_a);
    fen.assign(n + 1, 0);
    for (int i = 1; i <= n; i++)
    {
      fen[i] ^= _a[i - 1];
      int r = i + (i & -i);
      if (r <= n)
        fen[r] ^= fen[i];
    }
  }
  void update(int l, T v)
  {
    l++;
    for (; l <= n; l += l & -l)
      fen[l] ^= v;
  }
  void update(int l, int r, T v)
  {
    update(l, v);
    update(r + 1, v);
  }
  T get(int l)
  {
    l++;
    T res = 0;
    for (; l > 0; l -= l & -l)
      res ^= fen[l];
    return res;
  }
  T get(int l, int r)
  {
    return get(r) ^ get(l - 1);
  }
};

void solve()
{
  int n, q;
  cin >> n >> q;
  vec<ll> a(n);
  for (auto &i : a)
    cin >> i;
  vec<ll> odd(n), even(n);
  for (int i = 0; i < n; i++)
  {
    if (i & 1)
      odd[i] = a[i];
    else
      even[i] = a[i];
  }
  FenwickTree<ll> o(odd), e(even);
  while (q--)
  {
    int t;
    cin >> t;
    if (t == 1)
    {
      int i, j;
      cin >> i >> j;
      i--;
      if (i & 1)
        o.update(i, a[i] ^ j);
      else
        e.update(i, a[i] ^ j);
      a[i] = j;
    }
    else
    {
      int l, r;
      cin >> l >> r;
      --l, --r;
      int len = r - l + 1;
      if (!(len & 1))
      {
        cout << "0\n";
        continue;
      }

      if (l & 1)
        cout << o.get(l, r) << '\n';
      else
        cout << e.get(l, r) << '\n';
    }
  }
}

/*    /\_/\
 *   (= ._.)
 *   / >  \>
 */

int main()
{
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int t = 1;
  while (t--)
  {
    solve();
    cout << (t ? "\n" : "");
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...