Submission #1307377

#TimeUsernameProblemLanguageResultExecution timeMemory
1307377ayazXORanges (eJOI19_xoranges)C++20
55 / 100
1096 ms17960 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() {}
int a[sz];
struct SegmentTree {
  vi st;
  int n;
  void init(int _n) {
    n = _n;
    st.resize((n<<2)|1);
  }
  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);
  }
};
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;
  multiset<int> pos[2];
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    pos[i & 1].insert(a[i]);
  }
  SegmentTree st;
  st.init(n);
  st.build(1, n, 1);
  while (q--) {
    int t;
    cin >> t;
    if (t == 1) {
      int i, x;
      cin >> i >> x;
      pos[i & 1].erase(pos[i & 1].find(a[i]));
      st.update(i, x);
      a[i] = x;
      pos[i & 1].insert(a[i]);
    } else {
      int l, r;
      cin >> l >> r;
      if ((r - l + 1) & 1) {
        int ans = st.getans(l, r);
        for (int i = 1; i <= (r - l + 1); i++) {
          if (!(i & 1)) {
            ans ^= a[l + i - 1];
          }
        }
        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...