#include<iostream>
#include<vector>
using namespace std;
struct segtree {
int n;
vector<int> arr;
segtree(int sizex) {
n = 1;
while (n < sizex) n<<=1;
arr.resize(2*n);
}
void build(vector<int> &init, int x, int lx, int rx) {
if (rx - lx == 1) {
if (lx < init.size()) arr[x] = init[lx];
return;
}
int m = (lx+rx)>>1;
build(init,2*x+1,lx,m);
build(init,2*x+2,m,rx);
arr[x] = arr[2*x+1] ^ arr[2*x+2];
}
void build(vector<int> &init){ build(init,0,0,n); }
void update(int i, int v, int x, int lx, int rx) {
if (rx - lx == 1 and lx == i){ arr[x] = v; return; }
if (lx <= i and i <= rx) {
int m = (lx+rx)>>1;
if (i < m) update(i,v,2*x+1,lx,m);
else update(i,v,2*x+2,m,rx);
arr[x] = arr[2*x+1] ^ arr[2*x+2];
}
}
int query(int i, int j, int x, int lx, int rx) {
if (i <= lx and rx <= j) return arr[x];
if (i >= rx or j <= lx) return 0;
int m = (lx+rx)>>1;
return query(i,j,2*x+1,lx,m) ^ query(i,j,2*x+2,m,rx);
}
void update(int i, int v){update(i,v,0,0,n);};
int query(int i, int j){return query(i,j,0,0, n);}
void debug() {
for (int i = 0; i < 2*n - 1; i++) cerr<<arr[i]<<" ";
cerr<<endl;
}
};
int main() {
int n,q; cin>>n>>q;
vector<int> odd;
vector<int> even;
for (int i = 0; i < n; i++) {
int x; cin>>x;
if (i & 1) even.push_back(x);
else odd.push_back(x);
}
segtree seg_odd(odd.size()),seg_even(even.size());
seg_odd.build(odd); seg_even.build(even);
while (q--) {
int t; cin>>t;
if (t == 1) {
int i,j; cin>>i>>j; i--;
if (i&1) seg_even.update(i/2,j);
else seg_odd.update(i/2,j);
}
else {
int u,v; cin>>u>>v; u--; v--;
if (u&1) cout<<seg_even.query(u/2,(v/2)+1)<<endl;
else cout<<seg_odd.query(u/2,(v/2)+1)<<endl;
}
}
}