#include <bits/stdc++.h>
using namespace std;
template <class T>
bool umin(T& a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool umax(T& a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
long long F[2][2][1009][1009];
void upd(int x, int y, long long v) {
  for (int i = x; i < 1009; i += i & (-i))
    for (int j = y; j < 1009; j += j & (-j))
      F[x & 1][y & 1][i][j] = F[x & 1][y & 1][i][j] xor v;
}
long long tap(int x, int y) {
  long long res = 0;
  for (int i = x; i; i -= i & (-i))
    for (int j = y; j; j -= j & (-j)) res = res xor F[x & 1][y & 1][i][j];
  return res;
}
int main() {
  int n, q;
  scanf("%d%d", &n, &q);
  while (q--) {
    int type, x, x1, y1, y;
    long long v;
    scanf("%d%d%d%d%d", &type, &x, &y, &x1, &y1);
    if (type == 2) {
      scanf("%lld", &v);
      upd(x, y, v);
      upd(x1 + 1, y, v);
      upd(x, y1 + 1, v);
      upd(x1 + 1, y1 + 1, v);
    } else
      printf("%lld\n", tap(x1, y1) xor tap(x1, y - 1) xor tap(x - 1, y1) xor
                           tap(x - 1, y - 1));
  }
  return 0;
}
