#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
const int M = 1000000007;
int n, m;
inline int parity(int x, int y) { return (x & 1) + ((y & 1) << 1); }
template <typename T>
struct BIT {
  T A[N][N];
  int lowbit(int x) { return x & -x; }
  void init() { memset(A, 0, sizeof(A)); }
  T get(int x, int y) {
    T ret = 0;
    for (int i = x; i > 0; i -= lowbit(i)) {
      for (int j = y; j > 0; j -= lowbit(j)) {
        ret ^= A[i][j];
      }
    }
    return ret;
  }
  void update(int x, int y, T v) {
    for (int i = x; i <= n; i += lowbit(i)) {
      for (int j = y; j <= n; j += lowbit(j)) {
        A[i][j] ^= v;
      }
    }
  }
};
BIT<long long> bit[4];
int main() {
  char op[2];
  scanf("%d%d", &n, &m);
  for (int i = 0, x1, y1, x2, y2; i < m; i++) {
    scanf("%s%d%d%d%d", op, &x1, &y1, &x2, &y2);
    if (op[0] == '2') {
      long long k;
      scanf("%I64d", &k);
      bit[parity(x1, y1)].update(x1, y1, k);
      bit[parity(x1, y2 + 1)].update(x1, y2 + 1, k);
      bit[parity(x2 + 1, y1)].update(x2 + 1, y1, k);
      bit[parity(x2 + 1, y2 + 1)].update(x2 + 1, y2 + 1, k);
    } else {
      long long ans = bit[parity(x1 - 1, y1 - 1)].get(x1 - 1, y1 - 1);
      ans ^= bit[parity(x1 - 1, y2)].get(x1 - 1, y2);
      ans ^= bit[parity(x2, y1 - 1)].get(x2, y1 - 1);
      ans ^= bit[parity(x2, y2)].get(x2, y2);
      printf("%I64d\n", ans);
    }
  }
}
