#include <bits/stdc++.h>
const int MAXN = 1000 + 5;
int n, m;
long long c[4][MAXN][MAXN];
void modify(int x, int y, long long k) {
  int obs = 0;
  if (x & 1) obs++;
  if (y & 1) obs++, obs++;
  for (int i = x; i < MAXN; i += i & (-i)) {
    for (int j = y; j < MAXN; j += j & (-j)) {
      c[obs][i][j] ^= k;
    }
  }
}
long long query(int x, int y) {
  int obs = 0;
  if (x & 1) obs++;
  if (y & 1) obs++, obs++;
  long long res = 0;
  for (int i = x; i > 0; i -= i & (-i)) {
    for (int j = y; j > 0; j -= j & (-j)) {
      res ^= c[obs][i][j];
    }
  }
  return res;
}
long long rd() {
  long long x;
  scanf("%I64d", &x);
  return x;
}
int main() {
  n = rd(), m = rd();
  while (m--) {
    long long k;
    int _1x, _2x, _1y, _2y, _3x, _3y, _4x, _4y, opt;
    scanf("%d", &opt);
    if (opt == 2) {
      scanf("%d%d%d%d%I64d", &_1x, &_1y, &_2x, &_2y, &k);
      modify(_1x, _1y, k);
      modify(_2x + 1, _2y + 1, k);
      modify(_1x, _2y + 1, k);
      modify(_2x + 1, _1y, k);
    } else if (opt == 1) {
      scanf("%d%d%d%d", &_1x, &_1y, &_2x, &_2y);
      long long res1 = query(_1x - 1, _1y - 1);
      long long res2 = query(_2x, _2y);
      long long res3 = query(_1x - 1, _2y);
      long long res4 = query(_2x, _1y - 1);
      printf("%I64d\n", res1 ^ res2 ^ res3 ^ res4);
    }
  }
  return 0;
}
