#include <bits/stdc++.h>
using namespace std;
template <class T>
bool setmin(T &a, T b) {
  if (b < a) {
    a = b;
    return true;
  } else
    return false;
}
template <class T>
bool setmax(T &a, T b) {
  if (b > a) {
    a = b;
    return true;
  } else
    return false;
}
const int MAXN = 1010;
long long t[2][2][MAXN][MAXN];
int n;
long long get(int x, int y) {
  int a = x & 1, b = y & 1;
  x = (x + 1) / 2, y = (y + 1) / 2;
  long long ans = 0;
  for (int i = x; i >= 1; i -= (i & -i))
    for (int j = y; j >= 1; j -= (j & -j)) ans ^= t[a][b][i][j];
  return ans;
}
void put(int x, int y, long long v) {
  int a = x & 1, b = y & 1;
  x = (x + 1) / 2, y = (y + 1) / 2;
  for (int i = x; i <= n; i += (i & -i))
    for (int j = y; j <= n; j += (j & -j)) t[a][b][i][j] ^= v;
}
int main() {
  int qs;
  scanf("%d%d", &n, &qs);
  ++n;
  memset(t, (0), sizeof(t));
  while (qs--) {
    int op;
    int x1, y1, x2, y2;
    long long v;
    scanf("%d", &op);
    scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
    if (op == 1) {
      long long ans = get(x2, y2);
      ans ^= get(x1 - 1, y2);
      ans ^= get(x2, y1 - 1);
      ans ^= get(x1 - 1, y1 - 1);
      cout << ans << endl;
    } else {
      cin >> v;
      put(x1, y1, v);
      put(x2 + 1, y1, v);
      put(x1, y2 + 1, v);
      put(x2 + 1, y2 + 1, v);
    }
  }
  return 0;
}
