#include <bits/stdc++.h>
using namespace std;
const int MAXN = (1 << 10);
template <class T>
struct fenwick {
  int sz;
  T tr[MAXN];
  void init(int n) {
    sz = n + 1;
    memset(tr, 0, sizeof(tr));
  }
  T query(int idx) {
    T ans = 0;
    for (; idx >= 1; idx -= (idx & -idx)) ans ^= tr[idx];
    return ans;
  }
  void update(int idx, T val) {
    if (idx <= 0) return;
    for (; idx <= sz; idx += (idx & -idx)) tr[idx] ^= val;
  }
  T query(int l, int r) { return query(r) ^ query(l - 1); }
};
template <class T>
struct fenwick_2d {
  int sz;
  fenwick<T> tr[MAXN];
  void init(int n) {
    sz = n + 1;
    for (int i = 1; i <= sz; i++) tr[i].init(n);
  }
  T query(int x, int y) {
    T ans = 0;
    for (; x >= 1; x -= (x & -x)) ans ^= tr[x].query(y);
    return ans;
  }
  void update(int x, int y, T val) {
    if (x <= 0) return;
    for (; x <= sz; x += (x & -x)) tr[x].update(y, val);
  }
};
int n, m;
fenwick_2d<int64_t> t[4];
void read() { cin >> n >> m; }
int64_t query(int x, int y) { return t[((x & 1) << 1) | (y & 1)].query(x, y); }
void update(int x, int y, int64_t val) {
  t[((x & 1) << 1) | (y & 1)].update(x, y, val);
}
void solve() {
  for (int idx = 0; idx < 4; idx++) t[idx].init(n);
  for (int i = 0; i < m; i++) {
    int type, x0, y0, x1, y1;
    cin >> type >> x0 >> y0 >> x1 >> y1;
    if (type == 1)
      cout << (query(x1, y1) ^ query(x0 - 1, y1) ^ query(x1, y0 - 1) ^
               query(x0 - 1, y0 - 1))
           << '\n';
    else {
      int64_t val;
      cin >> val;
      update(x0, y0, val);
      update(x1 + 1, y0, val);
      update(x0, y1 + 1, val);
      update(x1 + 1, y1 + 1, val);
    }
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  read();
  solve();
  return 0;
}
