#include <bits/stdc++.h>
using namespace std;
long long BIT[8][1001][1001];
int n, m;
long long QueryBit(int id0, int id1, int bt) {
  long long ret = 0;
  while (id0 > 0) {
    int id2 = id1;
    while (id2 > 0) {
      ret ^= BIT[bt][id0][id2];
      id2 -= id2 & (-id2);
    }
    id0 -= id0 & (-id0);
  }
  return ret;
}
void UpdateBit(int id0, int id1, int bt, long long val) {
  while (id0 <= n) {
    int id2 = id1;
    while (id2 <= n) {
      BIT[bt][id0][id2] ^= val;
      id2 += id2 & (-id2);
    }
    id0 += id0 & (-id0);
  }
  return;
}
void UpdateBlock(int x0, int y0, int x1, int y1, int bt, long long val) {
  UpdateBit(x0, y0, bt + (x0 % 2 * 2 + y0 % 2), val);
  UpdateBit(x0, y1 + 1, bt + (x0 % 2 * 2 + y0 % 2), val);
  UpdateBit(x1 + 1, y0, bt + (x0 % 2 * 2 + y0 % 2), val);
  UpdateBit(x1 + 1, y1 + 1, bt + (x0 % 2 * 2 + y0 % 2), val);
  return;
}
long long QueryBlock(int x0, int y0, int x1, int y1, int bt) {
  long long ret = QueryBit(x1, y1, bt + (x1 % 2 * 2 + y1 % 2));
  ret ^= QueryBit(x0 - 1, y1, bt + ((x0 - 1) % 2 * 2 + y1 % 2));
  ret ^= QueryBit(x1, y0 - 1, bt + (x1 % 2 * 2 + (y0 - 1) % 2));
  ret ^= QueryBit(x0 - 1, y0 - 1, bt + ((x0 + 1) % 2 * 2 + (y0 + 1) % 2));
  return ret;
}
void UpdateBlock2(int x0, int y0, int x1, int y1, int bt, long long val) {
  UpdateBit(x0, y0, bt + x0 % 2, val);
  UpdateBit(x0, y1 + 1, bt + x0 % 2, val);
  UpdateBit(x1 + 1, y0, bt + (x0) % 2, val);
  UpdateBit(x1 + 1, y1 + 1, bt + (x0) % 2, val);
  return;
}
long long QueryBlock2(int x0, int y0, int x1, int y1, int bt) {
  long long ret = QueryBit(x1, y1, bt + (x1) % 2);
  ret ^= QueryBit(x0 - 1, y1, bt + (x0 - 1) % 2);
  ret ^= QueryBit(x1, y0 - 1, bt + (x1) % 2);
  ret ^= QueryBit(x0 - 1, y0 - 1, bt + (x0 - 1) % 2);
  return ret;
}
void UpdateBlock3(int x0, int y0, int x1, int y1, int bt, long long val) {
  UpdateBit(x0, y0, bt + (y0) % 2, val);
  UpdateBit(x0, y1 + 1, bt + (y0) % 2, val);
  UpdateBit(x1 + 1, y0, bt + (y0) % 2, val);
  UpdateBit(x1 + 1, y1 + 1, bt + (y0) % 2, val);
  return;
}
long long QueryBlock3(int x0, int y0, int x1, int y1, int bt) {
  long long ret = QueryBit(x1, y1, bt + (y1) % 2);
  ret ^= QueryBit(x0 - 1, y1, bt + (y1) % 2);
  ret ^= QueryBit(x1, y0 - 1, bt + (y0 - 1) % 2);
  ret ^= QueryBit(x0 - 1, y0 - 1, bt + (y0 - 1) % 2);
  return ret;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < m; i++) {
    int type;
    scanf("%d", &type);
    int x0, y0, x1, y1;
    scanf("%d%d%d%d", &x0, &y0, &x1, &y1);
    if (type == 1) {
      long long pr = QueryBlock(x0, y0, x1, y1, 0);
      pr ^= QueryBlock2(x0, y0, x1, y1, 4);
      pr ^= QueryBlock3(x0, y0, x1, y1, 6);
      printf("%lld\n", pr);
    } else {
      long long value;
      scanf("%lld", &value);
      UpdateBlock(x0, y0, x1, y1, 0, value);
      if ((y1 - y0 + 1) % 2) UpdateBlock2(x0, y1 + 1, x1, n, 4, value);
      if ((x1 - x0 + 1) % 2) UpdateBlock3(x1 + 1, y0, n, y1, 6, value);
      if ((x1 - x0 + 1) & (y1 - y0 + 1) & 1) {
        UpdateBit(x1 + 1, y1 + 1, 0, value);
        UpdateBit(x1 + 1, y1 + 1, 1, value);
        UpdateBit(x1 + 1, y1 + 1, 2, value);
        UpdateBit(x1 + 1, y1 + 1, 3, value);
      }
    }
  }
  return 0;
}
