#include <bits/stdc++.h>
using namespace std;
const int MAX = 1005;
long long int iTree[4][MAX][MAX];
int n, m;
inline int get_sw(int y, int x) {
  if (y % 2 && x % 2)
    return 0;
  else if (y % 2)
    return 1;
  else if (x % 2)
    return 2;
  else
    return 3;
}
inline int low_bit(int x) { return x & (-x); }
void update(int y, int x, long long int value) {
  if (y <= 0 || x <= 0) return;
  int temp_y = y, temp_x = x;
  int sw = get_sw(y, x);
  while (y <= n) {
    x = temp_x;
    while (x <= n) {
      iTree[sw][y][x] ^= value;
      x += low_bit(x);
    }
    y += low_bit(y);
  }
}
long long int get_value(int y, int x) {
  if (y <= 0 || x <= 0) return 0;
  long long int ret_value = 0;
  int temp_y = y, temp_x = x;
  int sw = get_sw(y, x);
  while (y) {
    x = temp_x;
    while (x) {
      ret_value ^= iTree[sw][y][x];
      x -= low_bit(x);
    }
    y -= low_bit(y);
  }
  return ret_value;
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= m; i++) {
    int a;
    int y0, x0, y1, x1;
    scanf("%d", &a);
    if (a == 2) {
      long long int value;
      scanf("%d %d %d %d", &y0, &x0, &y1, &x1);
      scanf("%I64d", &value);
      int sw = get_sw(y0, x0);
      update(y0, x0, value);
      update(y0, x1 + 1, value);
      update(y1 + 1, x0, value);
      update(y1 + 1, x1 + 1, value);
    } else {
      long long int value = 0;
      scanf("%d %d %d %d", &y0, &x0, &y1, &x1);
      value ^= get_value(y1, x1);
      value ^= get_value(y1, x0 - 1);
      value ^= get_value(y0 - 1, x1);
      value ^= get_value(y0 - 1, x0 - 1);
      printf("%I64d\n", value);
    }
  }
  return 0;
}
