Submission #1307378

#TimeUsernameProblemLanguageResultExecution timeMemory
1307378ayazXORanges (eJOI19_xoranges)C++20
100 / 100
126 ms28140 KiB
#include <bits/stdc++.h>
using namespace std;

#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#define line() "author : AyazN";
#endif

typedef long long ll;

#define all(x) (x).begin(), (x).end()
#define isz(x) (int)(x.size())
#define int ll

typedef long double ld;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<pii> vpii;

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

const int sz = 200500, inf = 1000000000;
const ll mod = 1000000007, INF = 1000000000000000000;

void precompute() {}
struct SegmentTree {
  vi st;
  int n;
  vi a;
  void init(int _n, int A[]) {
    n = _n;
    st.resize((n<<2)|1);
    a.resize(n + 1);
    for (int i = 1; i <= n; i++) a[i] = A[i];
  }
  void build(int l, int r, int v) {
    if (l == r) {
      st[v] = a[l];
      return;
    }
    int mid = (l + r)>>1;
    build(l, mid, v<<1);
    build(mid + 1, r, v<<1|1);
    st[v] = (st[v<<1] ^ st[v<<1|1]);  
  }
  int getans(int ql, int qr, int l, int r, int v) {
    if (ql > r || l > qr) return 0;
    if (ql <= l && r <= qr) return st[v];
    int mid = (l + r)>>1;
    return (getans(ql, qr, l, mid, v<<1) ^ getans(ql, qr, mid + 1, r, v<<1|1));
  }
  int getans(int l, int r) {
    return getans(l, r, 1, n, 1);
  }
  void update(int l, int r, int pos, int val, int v) {
    if (l > pos || pos > r) return;
    if (l == r) {
      st[v] = val;
      return;
    }
    int mid = (l + r)>>1;
    update(l, mid, pos, val, v<<1);
    update(mid + 1, r, pos, val, v<<1|1);
    st[v] = (st[v<<1] ^ st[v<<1|1]);  
  }
  void update(int pos, int val) {
    update(1, n, pos, val, 1);
  }
};

int a[sz];
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
#ifdef LOCAL
  freopen("err.log", "w", stderr);
#endif
  precompute();
  int n, q;
  cin >> n >> q;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  SegmentTree st, stOdd, stEven;
  st.init(n, a);
  st.build(1, n, 1);
  int b[n + 1];
  for (int i = 1; i <= n; i++) b[i] = (i & 1 ? 0 : a[i]);
  stEven.init(n, b);
  stEven.build(1, n, 1);
  for (int i = 1; i <= n; i++) b[i] = (!(i & 1) ? 0 : a[i]);
  stOdd.init(n, b);
  stOdd.build(1, n, 1);
  while (q--) {
    int t;
    cin >> t;
    if (t == 1) {
      int i, x;
      cin >> i >> x;
      st.update(i, x);
      if (i & 1) {
        stOdd.update(i, x);
      } else {
        stEven.update(i, x);
      }
    } else {
      int l, r;
      cin >> l >> r;
      if ((r - l + 1) & 1) {
        int ans = st.getans(l, r);
        if (l & 1) {
          ans ^= stEven.getans(l, r);
        } else {
          ans ^= stOdd.getans(l, r);
        }
        cout << ans << '\n';
      } else {
        cout << 0 << '\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...