#include <bits/stdc++.h>
using namespace std;
const int maxN = 100000;
struct segment_tree {
vector<int> tree;
void init(int n) {
tree.resize(4*n, 0);
}
void build(int id, int l, int r, vector<int> &a) {
if (l == r) {
tree[id] = a[l];
}
else {
int mid = (l+r) / 2;
build(id*2, l, mid, a);
build(id*2+1, mid+1, r, a);
tree[id] = tree[id*2] ^ tree[id*2+1];
}
}
void update(int id, int l, int r, int position, int value) {
if (l == r) {
tree[id] = value;
}
else {
int mid = (l+r) / 2;
if (position <= mid) {
update(id*2, l, mid, position, value);
}
else {
update(id*2+1, mid+1, r, position, value);
}
tree[id] = tree[id*2] ^ tree[id*2+1];
}
}
int query(int id, int l, int r, int L, int R) {
if (l > R || r < L) return 0;
if (L <= l && r <= R) return tree[id];
int mid = (l+r) / 2;
int left = query(id*2, l, mid, L, R);
int right = query(id*2+1, mid+1, r, L, R);
return left ^ right;
}
};
int main() {
int n, q;
cin >> n >> q;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
vector<int> odd(n);
vector<int> even(n);
for (int i = 0; i < n; i++) {
if (i % 2 == 0) {
odd[i] = a[i];
even[i] = 0;
}
else {
odd[i] = 0;
even[i] = a[i];
}
}
segment_tree odd_segment;
segment_tree even_segment;
odd_segment.init(n);
even_segment.init(n);
odd_segment.build(1,0,n-1, odd);
even_segment.build(1,0,n-1,even);
for (int i = 0; i < q; i++) {
int operation, l, r;
cin >> operation >> l >> r;
if (operation == 1) {
l--;
if (l % 2 == 0) {
odd_segment.update(1, 0, n-1, l, r);
}
else {
even_segment.update(1,0,n-1,l,r);
}
}
else {
l--;
r--;
if ((r-l+1) % 2 == 0) cout << 0 << '\n';
else {
if (l % 2 == 0) {
int ans = odd_segment.query(1,0,n-1,l, r);
cout << ans << '\n';
}
else {
cout << even_segment.query(1,0,n-1,l,r) << '\n';
}
}
}
}
}