#include <bits/stdc++.h>
const int MAXN = 1024;
int n;
inline int LowBit(int x) { return x & -x; }
class C_TreeArray {
 public:
  C_TreeArray() { memset(tr, 0, sizeof(tr)); }
  ~C_TreeArray() {}
  void Modify(int x, long long v) {
    while (x <= n) {
      tr[x] ^= v;
      x += LowBit(x);
    }
  }
  long long Sum(int x) {
    long long ans = 0;
    while (x) {
      ans ^= tr[x];
      x -= LowBit(x);
    }
    return ans;
  }
  long long tr[MAXN];
};
class C_Xor_TreeArray {
 public:
  void Modify(int x, long long v) { tr[x & 1].Modify(x, v); }
  long long Sum(int x) { return tr[x & 1].Sum(x); }
  C_TreeArray tr[2];
};
class C_2D_TreeArray {
 public:
  void Modify(int x, int y, long long v) {
    while (x <= n) {
      tr[x].Modify(y, v);
      x += LowBit(x);
    }
  }
  long long Sum(int x, int y) {
    long long ans = 0;
    while (x) {
      ans ^= tr[x].Sum(y);
      x -= LowBit(x);
    }
    return ans;
  }
  C_Xor_TreeArray tr[MAXN];
};
class C_2D_Xor_TreeArray {
 public:
  void Modify(int x, int y, long long v) { tr[x & 1].Modify(x, y, v); }
  long long Sum(int x, int y) { return tr[x & 1].Sum(x, y); }
  C_2D_TreeArray tr[2];
} tt;
int main() {
  int m, x0, x1, y0, y1;
  long long v;
  scanf("%d%d", &n, &m);
  while (m--) {
    scanf("%d", &x0);
    if (x0 == 1) {
      scanf("%d%d%d%d", &x0, &y0, &x1, &y1);
      printf("%I64d\n", tt.Sum(x1, y1) ^ tt.Sum(x0 - 1, y1) ^
                            tt.Sum(x1, y0 - 1) ^ tt.Sum(x0 - 1, y0 - 1));
    } else {
      scanf("%d%d%d%d%I64d", &x0, &y0, &x1, &y1, &v);
      tt.Modify(x0, y0, v);
      tt.Modify(x1 + 1, y0, v);
      tt.Modify(x0, y1 + 1, v);
      tt.Modify(x1 + 1, y1 + 1, v);
    }
  }
  return 0;
}
