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

int N, Q;
int A[300005];
bool fenwick[35][300005];

void update_bit(int idx, int bit) {
  for (int i = idx; i <= N; i += (i & -i)) {
    fenwick[bit][i] ^= 1;
  }
}

void update(int idx, int y) {
  A[idx] ^= y;
  for (int i = 0; i < 30; i++) {
    if (y & (1 << i)) { 
      update_bit(idx, i);
    }
  }
}

int get_bit(int pos, int bit) {
  bool res = 0;
  for (int i = pos; i > 0; i -= (i & -i)) {
    res ^= fenwick[bit][i];
  }
  return res;
}

void query(int l, int r) {
  int ans = 0;
  for (int i = 0; i < 30; i++) {
    if (get_bit(l - 1, i) ^ get_bit(r, i)) {
      ans = ans | (1 << i);
    }
  }
  cout << ans << "\n";  
}

int main() {
  ios_base::sync_with_stdio(0);
  cin >> N >> Q;
  int x, y;
  for (int i = 1; i <= N; i++) {
    cin >> y;
    update(i, y);
  }
  int ty;
  while (Q--) {
    cin >> ty >> x >> y;
    if (ty == 1) {
      update(x, y);
    }else {
      query(x, y);
    }
  }
}

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

#define rep(i,n) for(int i=0;i<(n);i++)

typedef long long ll;

#define REP(i,n) for(ll i=0;i<(ll)(n);i++)
#define REPD(i,n) for(ll i=n-1;i>=0;i--)
#define FOR(i,a,b) for(ll i=a;i<=(ll)(b);i++)
#define FORD(i,a,b) for(ll i=a;i>=(ll)(b);i--)
//定数
#define INF 1001001001 //10^9:極めて大きい値,∞
//略記
#define PB push_back //vectorヘの挿入
#define MP make_pair //pairのコンストラクタ
#define F first //pairの一つ目の要素
#define S second //pairの二つ目の要素
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0;};
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0;};

template<typename T>
struct BIT {
  int n;
  vector<T> d;
  BIT(int n=0):n(n),d(n+1,0) {}
  void init(int nn) {
        n=nn;
        d.resize(nn+1);
        for(int i=0;i<nn+1;i++) d[i]=0;
    }
    void add(int i, T w=1) {
        for (int x = i; x <= n; x += x & -x) d[x] += w;
    }
    T sum(int i) { // [1,x]
        T ret = 0;
        for (int x = i; x > 0; x -= x & -x) ret += d[x];
        return ret;
    }
    T sum(int l, int r) { // [l,r)
        return sum(r-1) - sum(l-1);
    }
};
// BIT配列の宣言 N:配列数, n:各要素数;
// BIT<int> bit[N];
// rep(i,N) bit[i].init(n);


int main(){
    ios::sync_with_stdio(false); 
    int N, Q;
    cin >> N >> Q;
    int n=30;
    BIT<int> bit[n];
    rep(i, n) bit[i].init(N);
    rep(i, N){ 
        int a;
        cin >> a;
        rep(j, n){
            if(a&(1<<j)) bit[j].add(i+1, 1);
        }
    }
    rep(i, Q){
        int t, x, y;
        cin >> t >> x >> y;
        if(t==1){
            rep(j, n){
                if(y&(1<<j)) bit[j].add(x, 1);
            }
        }
        else{
            int ans=0;
            int mul=1;
            rep(j,n){
                if(bit[j].sum(x,y+1)%2==1) ans+=mul;
                mul*=2;
            }
            cout << ans << endl;
        }
    }
    return 0;
}