#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));
}
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);
}
segTree* query(int l, int r, segTree*st){
segTree * ret = new segTree(l);
ret->l = st->l;
ret->r = st->r;
ret->xor0 = st->xor0;
ret->xor1 = st->xor1;
if(st->l == st->r){
return ret;
}
int mid = (st->l + st->r)/2;
segTree * le=nullptr; segTree*ri=nullptr;
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) return ri;
if(!ri) return le;
ret->l = le->l;
ret->r = ri->r;
ret->xor0 = le->xor0 ^ ((le->even)?ri->xor0:ri->xor1);
ret->xor1 = le->xor1 ^ ((le->even)?ri->xor1:ri->xor0);
ret->even = (ret->r - ret->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--;
segTree * qu = query(l, r, seg);
if(qu->even) cout<< 0;
else cout<<qu->xor0;
cout<<endl;
delete qu;
}
}
delete seg;
return 0;
}