#include <iostream>
#include <vector>
using namespace std;
vector<int> arr;
struct segTree{
segTree * lc, * rc;
int l, r;
int xor0, xor1;
int even;
segTree(int indx){
even = 0;
l = r = indx;
xor0 = arr[indx];
xor1 = 0;
lc = rc = nullptr;
}
segTree(segTree*le, segTree*ri){
lc = le;
rc = ri;
l = le->l;
r = ri->r;
xor0 = le->xor0;
if(lc->even) xor0 ^= rc->xor0;
else xor0 ^= rc->xor1;
xor1 = le->xor1;
if(lc->even) xor1 ^= rc->xor1;
else xor1 ^= rc->xor0;
even = !((r-l+1)%2);
}
~segTree(){
if(lc) delete lc;
if(rc) delete rc;
}
};
segTree*build(int l, int r){
if(l == r) return new segTree(l);
int mid = (l+r)/2;
return new segTree(build(l, mid), build(mid+1, r));
}
struct plain_ans{
int xor0;
int xor1;
int even;
};
void update(int indx, int newVal, segTree*st){
if(st->l == st->r){
st->xor0 = newVal;
return;
}
int mid = (st->l + st->r)/2;
if(indx<=mid) update(indx, newVal, st->lc);
else update(indx, newVal, st->rc);
if(st->lc->even){
st->xor0 = st->lc->xor0 ^ st->rc->xor0;
st->xor1 = st->lc->xor1 ^ st->rc->xor1;
}
else{
st->xor0 = st->lc->xor0 ^ st->rc->xor1;
st->xor1 = st->lc->xor1 ^ st->rc->xor0;
}
st->even = !((st->r-st->l+1)%2);
}
plain_ans query(int l, int r, segTree*st){
plain_ans ret;
if(st->l == st->r){
ret.even = !((r-l+1) %2);
ret.xor1 = 0;
ret.xor0 = st->xor0;
return ret;
}
if(st->l == l && st->r == r){
ret.even = st->even;
ret.xor1 = st->xor1;
ret.xor0 = st->xor0;
return ret;
}
int mid = (st->l + st->r)/2;
plain_ans le, ri;
le.even = ri.even = -1;
if(l<=mid) le = query(l, min(mid, r), st->lc);
if(r>mid) ri = query(max(mid+1, l), r, st->rc);
if(le.even==-1) return ri;
if(ri.even == -1) return le;
ret.xor0 = le.xor0 ^ ((le.even)?ri.xor0:ri.xor1);
ret.xor1 = le.xor1 ^ ((le.even)?ri.xor1:ri.xor0);
ret.even = (r - l + 1) %2;
ret.even = !ret.even;
return ret;
}
int main(void){
// freopen("input.txt", "r", stdin);
int n, q;
cin>>n>>q;
arr.assign(n, 0);
for(int i = 0; i<n; i++) cin>>arr[i];
segTree * seg = build(0, n-1);
for(int i = 0; i<q; i++){
int act; cin>>act;
if(act == 1){
int indx, newVal;
cin>>indx>>newVal;
indx--;
update(indx, newVal, seg);
}
else{
int l, r; cin>>l>>r;
l--, r--;
plain_ans qu = query(l, r, seg);
if(qu.even) cout<< 0;
else cout<<qu.xor0;
cout<<endl;
}
}
delete seg;
return 0;
}