#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <stack>
#include <deque>
#include <bitset>
#include <numeric>
#include <cassert>
#include <sstream>
#include <climits>
using namespace std;
using ll = long long;
const int maxn = 2e5 + 5;
ll a[maxn];
ll stOdd[4*maxn], stEven[4*maxn];
int n, q;
void build(int id, int start, int end) {
if (start == end) {
if (start % 2 == 1) stOdd[id] = a[start];
else stOdd[id] = 0;
if (start % 2 == 0) stEven[id] = a[start];
else stEven[id] = 0;
return;
}
int mid = (start + end) / 2;
build(id*2, start, mid);
build(id*2+1, mid+1, end);
stOdd[id] = stOdd[id*2] ^ stOdd[id*2+1];
stEven[id] = stEven[id*2] ^ stEven[id*2+1];
}
void update(int id, int start, int end, int pos, ll val) {
if (start == end) {
a[pos] = val;
if (start % 2 == 1) stOdd[id] = val;
else stOdd[id] = 0;
if (start % 2 == 0) stEven[id] = val;
else stEven[id] = 0;
return;
}
int mid = (start + end) / 2;
if (pos <= mid) update(id*2, start, mid, pos, val);
else update(id*2+1, mid+1, end, pos, val);
stOdd[id] = stOdd[id*2] ^ stOdd[id*2+1];
stEven[id] = stEven[id*2] ^ stEven[id*2+1];
}
ll queryOdd(int id, int start, int end, int l, int r) {
if (r < start || end < l) return 0;
if (l <= start && end <= r) return stOdd[id];
int mid = (start + end) / 2;
ll p1 = queryOdd(2 * id, start, mid, l, r);
ll p2 = queryOdd(2 * id +1, mid+1, end, l, r);
return p1 ^ p2;
}
ll queryEven(int id, int start, int end, int l, int r) {
if (r < start || end < l) return 0;
if (l <= start && end <= r) return stEven[id];
int mid = (start + end) / 2;
ll p1 = queryEven(2 * id, start, mid, l, r);
ll p2 = queryEven(2 * id + 1, mid+1, end, l, r);
return p1 ^ p2;
}
int main() {
cin >> n >> q;
for (int i = 1; i <= n; i++) cin >> a[i];
build(1, 1, n);
while(q--) {
int type;
cin >> type;
if (type == 1) {
int x; ll y;
cin >> x >> y;
update(1, 1, n, x, y);
} else {
int l, r;
cin >> l >> r;
ll ans = 0;
if ((r-l+1) % 2 == 1) {
if (l % 2 == 1) ans = queryOdd(1, 1, n, l, r);
if (l % 2 == 0) ans = queryEven(1, 1, n, l, r);
}
cout << ans << "\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... |