#include <bits/stdc++.h>
#pragma GCC optimize(3, "inline", "Ofast")
using namespace std;
int n, m;
long long t[4][1010][1010];
int lowbit(int x) { return x & (-x); }
int opt(int x, int y) {
  int ans;
  if (x & 1)
    ans = 0;
  else
    ans = 2;
  if (y & 1)
    ans += 0;
  else
    ans += 1;
  return ans;
}
long long ask(int x, int y) {
  int op = opt(x, y);
  long long res = 0;
  for (int i = x; i; i -= lowbit(i))
    for (int j = y; j; j -= lowbit(j)) res ^= t[op][i][j];
  return res;
}
void add(int x, int y, long long v) {
  int op = opt(x, y);
  for (int i = x; i <= n; i += lowbit(i))
    for (int j = y; j <= n; j += lowbit(j)) t[op][i][j] ^= v;
}
long long query(int x0, int y0, int x1, int y1) {
  return ask(x1, y1) ^ ask(x1, y0 - 1) ^ ask(x0 - 1, y1) ^ ask(x0 - 1, y0 - 1);
}
void change(int x0, int y0, int x1, int y1, long long v) {
  add(x0, y0, v), add(x0, y1 + 1, v), add(x1 + 1, y0, v),
      add(x1 + 1, y1 + 1, v);
}
int main() {
  scanf("%d%d", &n, &m);
  int x0, y0, x1, y1, op;
  long long v;
  for (int i = 1; i <= m; i++) {
    scanf("%d", &op);
    scanf("%d%d%d%d", &x0, &y0, &x1, &y1);
    if (op == 1)
      printf("%lld\n", query(x0, y0, x1, y1));
    else
      scanf("%lld", &v), change(x0, y0, x1, y1, v);
  }
}
