// Source: https://usaco.guide/general/io
#include <bits/stdc++.h>
using namespace std;
vector<int> binodd;
vector<int> bineven;
vector<int> a;
int build_odd(int l, int r, int v){
// cout << "build_odd " << l << " " << r << " " << v << "\n";
if(r==l){
binodd[v]=a[r*2];
return binodd[v];
}
int tm=(r+l)/2;
binodd[v]=build_odd(l, tm, v*2) ^ build_odd(tm+1, r, v*2+1);
return binodd[v];
}
int query_odd(int l, int r, int ll, int rr, int v){
// cout << "query_odd " << l << " " << r << " " << ll << " " << rr << " " << v << "\n";
if(r<=rr && l>=ll){
return binodd[v];
}
if(l>rr || r<ll){
return 0;
}
int tm=(r+l)/2;
return query_odd(l, tm, ll, min(tm, rr), v*2) ^ query_odd(tm+1, r, max(tm+1, ll), rr, v*2+1);
}
void update_odd(int i, int h, int l, int r, int v){
// cout << "update_odd " << i << " " << h << " " << l << " " << r << " " << v << "\n";
if(i>=l && i<=r){
binodd[v]=binodd[v]^a[i*2];
binodd[v]=binodd[v]^h;
if(r==l) return;
int tm=(r+l)/2;
update_odd(i, h, l, tm, v*2);
update_odd(i, h, tm+1, r, v*2+1);
}else{
return;
}
}
int build_even(int l, int r, int v){
// cout << "build_even " << l << " " << r << " " << v << "\n";
if(r==l){
bineven[v]=a[r*2+1];
// cout << "build_even " << l << " " << r << " " << v << " -> " << bineven[v] << "\n";
return bineven[v];
}
int tm=(r+l)/2;
bineven[v]=build_even(l, tm, v*2) ^ build_even(tm+1, r, v*2+1);
// cout << "build_even " << l << " " << r << " " << v << " -> " << bineven[v] << "\n";
return bineven[v];
}
int query_even(int l, int r, int ll, int rr, int v){
// cout << "query_even " << l << " " << r << " " << ll << " " << rr << " " << v << "\n";
if(r<=rr && l>=ll){
// cout << "query_even " << l << " " << r << " " << ll << " " << rr << " " << v << " -> " << bineven[v] << "\n";
return bineven[v];
}
if(l>rr || r<ll){
// cout << "query_even " << l << " " << r << " " << ll << " " << rr << " " << v << " -> [0]\n";
return 0;
}
int tm=(r+l)/2;
int res1 = query_even(l, tm, ll, min(tm, rr), v*2);
int res2 = query_even(tm+1, r, max(tm+1, ll), rr, v*2+1);
// cout << "query_even " << l << " " << r << " " << ll << " " << rr << " " << v << " -> " << res1 << "^" << res2 << "=" << (res1^res2) << "\n";
return res1 ^ res2;
}
void update_even(int i, int h, int l, int r, int v){
// cout << "update_even " << i << " " << h << " " << l << " " << r << " " << v << "\n";
if(i>=l && i<=r){
bineven[v]=bineven[v]^a[i*2+1];
bineven[v]=bineven[v]^h;
if(r==l) return;
int tm=(r+l)/2;
update_even(i, h, l, tm, v*2);
update_even(i, h, tm+1, r, v*2+1);
}else{
return;
}
}
int main() {
int n, q;cin>>n>>q;
a.assign(2*n, 0);
for(int i=0;i<n;i++){
cin>>a[i];
}
bineven.assign(n*4, 0);
binodd.assign(n*4, 0);
build_odd(0, (n+1)/2, 1);
build_even(0, n/2, 1);
// cout << "binodd:"; for (int i = 0; i < n*2; i++) cout << " " << binodd[i]; cout << "\n";
// cout << "bineven:"; for (int i = 0; i < n*2; i++) cout << " " << bineven[i]; cout << "\n";
while(q--){
int x, y, z; cin>>x>>y>>z;
if(x==1){
if(y%2==1){
// cout << "\nupdate_odd\n";
update_odd(y/2, z, 0, (n+1)/2, 1);
// cout << "binodd:"; for (int i = 0; i < n*2; i++) cout << " " << binodd[i]; cout << "\n";
}else{
y--;
// cout << "\nupdate_even\n";
update_even(y/2, z, 0, n/2, 1);
// cout << "bineven:"; for (int i = 0; i < n*2; i++) cout << " " << bineven[i]; cout << "\n";
}
a[y] = z;
}else{
if((z-y)%2==0 && z%2==1){
// cout << "\nquery_odd\n";
// cout << "binodd:"; for (int i = 0; i < n*2; i++) cout << " " << binodd[i]; cout << "\n";
cout<<query_odd(0, (n+1)/2, y/2, z/2, 1)<<'\n';
}else if((z-y)%2==0){
y--;
z--;
// cout << "\nquery_even\n";
// cout << "bineven:"; for (int i = 0; i < n*2; i++) cout << " " << bineven[i]; cout << "\n";
cout<<query_even(0, n/2, y/2, z/2, 1)<<'\n';
}else{
cout<<0<<'\n';
}
}
}
}