#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
const long long Mod = 1e9 + 7;
template <class T>
T checkMax(T& r, T val) {
  if (r < val) r = val;
  return r;
}
template <class T>
T checkMin(T& r, T val) {
  if (r > val) r = val;
  return r;
}
int n, m, K;
long long a[2][2][N][N];
int lowbit(int x) { return x & (-x); }
void add(long long a[N][N], int x, int y, long long val) {
  while (x < N) {
    int ty = y;
    while (ty < N) {
      a[x][ty] ^= val;
      ty += lowbit(ty);
    }
    x += lowbit(x);
  }
}
long long sum(long long a[N][N], int x, int y) {
  long long res = 0;
  while (x) {
    int ty = y;
    while (ty) {
      res ^= a[x][ty];
      ty -= lowbit(ty);
    }
    x -= lowbit(x);
  }
  return res;
}
long long query(int x, int y) { return sum(a[x % 2][y % 2], x, y); }
void update(int x, int y, long long val) { add(a[x % 2][y % 2], x, y, val); }
int main() {
  int i, j, k;
  int n, m;
  scanf("%d%d", &n, &m);
  while (m--) {
    int t, x0, x1, y0, y1;
    scanf("%d", &t);
    if (t == 1) {
      scanf("%d%d%d%d", &x0, &y0, &x1, &y1);
      --x0, --y0;
      long long res =
          query(x1, y1) ^ query(x0, y0) ^ query(x0, y1) ^ query(x1, y0);
      cout << res << endl;
    } else {
      long long v;
      scanf("%d%d%d%d", &x0, &y0, &x1, &y1);
      cin >> v;
      ++x1, ++y1;
      update(x1, y1, v);
      update(x1, y0, v);
      update(x0, y1, v);
      update(x0, y0, v);
    }
  }
  return 0;
}
