#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 10;
const int maxm = 1e5 + 10;
const long long inf = 1e16 + 10;
const int mod = 313;
int getint() {
  char c;
  while ((c = getchar()) && !(c >= '0' && c <= '9') && c != '-')
    ;
  int ret = c - '0', sgn = 0;
  if (c == '-') sgn = 1, ret = 0;
  while ((c = getchar()) && c >= '0' && c <= '9') ret = ret * 10 + c - '0';
  if (sgn) ret = -ret;
  return ret;
}
int n, m;
struct Bt {
  long long bit[maxn][maxn];
  void add(int x, int y, long long val) {
    for (int i = x; i <= n; i += i & -i) {
      for (int j = y; j <= m; j += j & -j) {
        bit[i][j] ^= val;
      }
    }
  }
  long long get(int x, int y) {
    long long ans = 0;
    for (int i = x; i > 0; i -= i & -i) {
      for (int j = y; j > 0; j -= j & -j) {
        ans ^= bit[i][j];
      }
    }
    return ans;
  }
} d, dx, dy, dxy;
void update(int x, int y, long long val) {
  d.add(x, y, val);
  if (x % 2) dx.add(x, y, val);
  if (y % 2) dy.add(x, y, val);
  if ((x * y) % 2) dxy.add(x, y, val);
}
long long query(int x, int y) {
  long long ans = 0;
  if ((x + 1) * (y + 1) % 2) ans ^= d.get(x, y);
  if ((x + 1) % 2) ans ^= dy.get(x, y);
  if ((y + 1) % 2) ans ^= dx.get(x, y);
  ans ^= dxy.get(x, y);
  return ans;
}
long long ask(int a, int b, int c, int d) {
  long long ans =
      query(c, d) ^ query(a - 1, b - 1) ^ query(a - 1, d) ^ query(c, b - 1);
  return ans;
}
void upd(int a, int b, int c, int d, long long v) {
  update(a, b, v), update(c + 1, d + 1, v), update(c + 1, b, v),
      update(a, d + 1, v);
}
int main() {
  n = getint();
  m = n;
  int q = getint();
  for (int i = 1; i <= q; i++) {
    int op, a, b, c, d;
    scanf("%d%d%d%d%d", &op, &a, &b, &c, &d);
    if (op == 1) {
      cout << ask(a, b, c, d) << "\n";
    } else {
      long long x;
      cin >> x;
      upd(a, b, c, d, x);
    }
  }
  return 0;
}
