#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

ll a[1000000],tree[1000000];

void update(ll i,ll val,ll s,ll e,ll idx)
{
    if(i==s&&s==e)
    {
        tree[idx]=tree[idx]^val;
        return;
    }
    if(i>e||i<s)
    {
        return;
    }
    ll mid=(s+e)/2;
    update(i,val,s,mid,2*idx);
    update(i,val,mid+1,e,2*idx+1);
    tree[idx]=tree[2*idx]^tree[2*idx+1];
}

ll query(ll qs,ll qe,ll s,ll e,ll idx,ll ee)
{
    if(s>=qs&&e<=qe)
    return tree[idx];
    if(e<qs||s>qe)
    return 0;
    
    ll mid=(s+e)/2;
    ll left = query(qs,qe,s,mid,2*idx,ee);
    ll right = query(qs,qe,mid+1,e,2*idx+1,ee);
    
    return left^right;
}

void build(ll idx,ll s,ll e)
{
    if(s==e)
    {
        tree[idx]=a[s];
        return;
    }
    if(s>e)
    return;
    
    ll mid = (s+e)/2;
    build(2*idx,s,mid);
    build(2*idx+1,mid+1,e);
    tree[idx]=tree[2*idx]^tree[2*idx+1];
    //cout<<s<<' '<<e<<':'<<tree[idx]<<'\n';
}

void fun()
{
  ll n,q;
  cin>>n>>q;
  for(ll i=0;i<n;i++)
  {
      cin>>a[i];
  }
  build(1,0,n-1);
  ll q1,q2,qa;
  while(q--)
  {
      cin>>qa>>q1>>q2;
      q1--;
      q2--;
      if(qa==2)
      cout<<query(q1,q2,0,n-1,1,q1)<<'\n';
      else
      update(q1,q2+1,0,n-1,1);
  }
}

int main() {
	ll t;
	//cin>>t;
	t=1;
	while(t--)
	fun();
	return 0;
}

#include <bits/stdc++.h>
using namespace std;

struct BIT{
  vector<int> a;
  BIT(int n):a(n+1){}
  void xadd(int i,int x){
    while(i<a.size()){
      a[i]^=x;
      i+=i&-i;
    }
  }
  int xsum(int i){
    int ret=0;
    while(i>0){
      ret^=a[i];
      i-=i&-i;
    }
    return ret;
  }
};

int main(){
  int n,q;
  cin>>n>>q;
  BIT bit(n);
  for(int i=1;i<=n;i++){
    int a;
    cin>>a;
    bit.xadd(i,a);
  }
  for(int i=0;i<q;i++){
    int t,x,y;
    cin>>t>>x>>y;
    if(t==1)
      bit.xadd(x,y);
    else
      cout<<(bit.xsum(y)^bit.xsum(x-1))<<endl;
  }
}