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