#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
const int MOD = 1e9 + 7;
const int N = 1e3 + 5;
int n, m, type, xa, xb, ya, yb;
long long a[N][N], b[4][N][N], v;
pair<int, int> si[4];
void updatey(int type, int x, int y, long long v) {
  while (y <= si[type].second) {
    b[type][x][y] ^= v;
    y += y & -y;
  }
}
void updatex(int type, int x, int y, long long v) {
  while (x <= si[type].first) {
    updatey(type, x, y, v);
    x += x & -x;
  }
}
long long gety(int type, int x, int y) {
  long long ans = 0;
  while (y) {
    ans ^= b[type][x][y];
    y -= y & -y;
  }
  return ans;
}
long long getx(int type, int x, int y) {
  long long ans = 0;
  while (x) {
    ans ^= gety(type, x, y);
    x -= x & -x;
  }
  return ans;
}
void update(int xa, int ya, long long v) {
  updatex(xa % 2 * 2 + ya % 2, (xa + 1) / 2, (ya + 1) / 2, v);
}
void init() {
  int n0 = n / 2, n1 = (n + 1) / 2;
  si[0] = pair<int, int>(n0, n0);
  si[1] = pair<int, int>(n0, n1);
  si[2] = pair<int, int>(n1, n0);
  si[3] = pair<int, int>(n1, n1);
}
long long get(int x, int y) {
  int sel = x % 2 * 2 + y % 2;
  return getx(sel, (x + 1) / 2, (y + 1) / 2);
}
int main() {
  scanf("%d%d", &n, &m);
  init();
  while (m--) {
    scanf("%d%d%d%d%d", &type, &xa, &ya, &xb, &yb);
    if (type == 2) {
      scanf("%I64d", &v);
      update(xa, ya, v);
      update(xa, yb + 1, v);
      update(xb + 1, ya, v);
      update(xb + 1, yb + 1, v);
    } else
      printf("%I64d\n", get(xb, yb) ^ get(xa - 1, ya - 1) ^ get(xa - 1, yb) ^
                            get(xb, ya - 1));
  }
}
