#include <bits/stdc++.h>
using namespace std;
int n, q;
int A[200005];
int treeEven[800005];
int treeOdd[800005];
void build(int node, int l, int r)
{
if(l==r)
{
if(l%2==0)
{
treeEven[node]=A[l];
treeOdd[node]=0;
}
else
{
treeOdd[node]=A[l];
treeEven[node]=0;
}
}
else
{
int mid=(l+r)/2;
build(node*2, l, mid);
build(node*2+1, mid+1, r);
treeEven[node]=treeEven[node*2]^treeEven[node*2+1];
treeOdd[node]=treeOdd[node*2]^treeOdd[node*2+1];
}
}
void update(int node, int l, int r, int pos, int val)
{
if(l==r)
{
if(l%2==0)
{
treeEven[node]=val;
treeOdd[node]=0;
}
else
{
treeOdd[node]=val;
treeEven[node]=0;
}
}
else
{
int mid=(l+r)/2;
if(pos<=mid)
{
update(node*2, l, mid, pos, val);
}
else
{
update(node*2+1, mid+1, r, pos, val);
}
treeEven[node]=treeEven[node*2]^treeEven[node*2+1];
treeOdd[node]=treeOdd[node*2]^treeOdd[node*2+1];
}
}
int queryEven(int node, int l, int r, int L, int R)
{
if(R<l || L>r)
{
return 0;
}
if(L<=l && r<=R)
{
return treeEven[node];
}
int mid=(l+r)/2;
return queryEven(node*2, l, mid, L, R) ^ queryEven(node*2+1, mid+1, r, L, R);
}
int queryOdd(int node, int l, int r, int L, int R)
{
if(R<l || L>r)
{
return 0;
}
if(L<=l && r<=R)
{
return treeOdd[node];
}
int mid=(l+r)/2;
return queryOdd(node*2, l, mid, L, R) ^ queryOdd(node*2+1, mid+1, r, L, R);
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>q;
for(int i=0;i<n;i++)
{
cin>>A[i];
}
build(1, 0, n-1);
while(q--)
{
int x;
cin>>x;
if(x==1)
{
int i, j;
cin>>i>>j;
i--;
update(1, 0, n-1, i, j);
}
else
{
int l, r;
cin>>l>>r;
l--;
r--;
if((r-l+1)%2==0)
{
cout<<0<<endl;
}
else
{
if(l%2==0)
{
cout<<queryEven(1, 0, n-1, l, r)<<endl;
}
else
{
cout<<queryOdd(1, 0, n-1, l, r)<<endl;
}
}
}
}
return 0;
}