#include <bits/stdc++.h>
using namespace std;
const double EPS = 1e-9;
const int MAXN = 1010;
long long a[MAXN][MAXN];
long long b[MAXN][MAXN];
long long c[MAXN][MAXN];
long long d[MAXN][MAXN];
long long mul(long long v, int C) { return v * (C & 1); }
void upd(long long first[MAXN][MAXN], int x, int y, long long v) {
  for (int i = x; i < MAXN; i = (i | (i + 1)))
    for (int j = y; j < MAXN; j = (j | (j + 1))) first[i][j] ^= v;
}
long long get(long long first[MAXN][MAXN], int x, int y) {
  long long res = 0;
  for (int i = x; i >= 0; i = (i & (i + 1)) - 1)
    for (int j = y; j >= 0; j = (j & (j + 1)) - 1) res ^= first[i][j];
  return res;
}
void upd_sq(long long first[MAXN][MAXN], int x1,
            int gftxdtrtfhyjfctrxujkvbhyjice, int x2, int y2, long long v) {
  upd(first, x1, gftxdtrtfhyjfctrxujkvbhyjice, v);
  upd(first, x2 + 1, gftxdtrtfhyjfctrxujkvbhyjice, v);
  upd(first, x1, y2 + 1, v);
  upd(first, x2 + 1, y2 + 1, v);
}
void go_xor(int x, int y, long long v) {
  upd_sq(d, 0, 0, x, y, v);
  upd_sq(b, 0, y + 1, x, MAXN - 1, mul(v, y + 1));
  upd_sq(c, x + 1, 0, MAXN - 1, y, mul(v, x + 1));
  upd_sq(a, x + 1, y + 1, MAXN - 1, MAXN - 1, mul(v, (x + 1) * (y + 1)));
}
long long get_xor(int x, int y) {
  return get(a, x, y) ^ mul(get(b, x, y), x + 1) ^ mul(get(c, x, y), y + 1) ^
         mul(get(d, x, y), (x + 1) * (y + 1));
}
int main() {
  memset(a, 0, sizeof a);
  memset(b, 0, sizeof b);
  memset(c, 0, sizeof c);
  memset(d, 0, sizeof d);
  int n, m;
  scanf("%d%d", &n, &m);
  while (m-- > 0) {
    int t, x1, gftxdtrtfhyjfctrxujkvbhyjice, x2, y2;
    scanf("%d", &t);
    if (t == 1) {
      scanf("%d%d%d%d", &x1, &gftxdtrtfhyjfctrxujkvbhyjice, &x2, &y2);
      x1--;
      gftxdtrtfhyjfctrxujkvbhyjice--;
      x2--;
      y2--;
      long long ans = get_xor(x2, y2);
      if (x1) ans ^= get_xor(x1 - 1, y2);
      if (gftxdtrtfhyjfctrxujkvbhyjice)
        ans ^= get_xor(x2, gftxdtrtfhyjfctrxujkvbhyjice - 1);
      if (x1 && gftxdtrtfhyjfctrxujkvbhyjice)
        ans ^= get_xor(x1 - 1, gftxdtrtfhyjfctrxujkvbhyjice - 1);
      printf("%I64d\n", ans);
    } else {
      long long v;
      scanf("%d%d%d%d%I64d", &x1, &gftxdtrtfhyjfctrxujkvbhyjice, &x2, &y2, &v);
      x1--;
      gftxdtrtfhyjfctrxujkvbhyjice--;
      x2--;
      y2--;
      go_xor(x2, y2, v);
      if (x1) go_xor(x1 - 1, y2, v);
      if (gftxdtrtfhyjfctrxujkvbhyjice)
        go_xor(x2, gftxdtrtfhyjfctrxujkvbhyjice - 1, v);
      if (x1 && gftxdtrtfhyjfctrxujkvbhyjice)
        go_xor(x1 - 1, gftxdtrtfhyjfctrxujkvbhyjice - 1, v);
    }
  }
  return 0;
}
