#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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |