#include <bits/stdc++.h>
using namespace std;
long long tree[4][1002 + 5][1002 + 5];
long long qry(int pos, int idx, int idy) {
  long long sum = 0;
  while (idx > 0) {
    int y1 = idy;
    while (y1 > 0) {
      sum ^= tree[pos][idx][y1];
      y1 -= (y1 & -y1);
    }
    idx -= (idx & -idx);
  }
  return sum;
}
long long query(int pos, int idx, int idy) {
  return qry(pos, idx + 1, idy + 1);
}
void upd(int pos, int x, int y, long long val) {
  while (x <= 1002) {
    int y1 = y;
    while (y1 <= 1002) {
      tree[pos][x][y1] ^= val;
      y1 += (y1 & -y1);
    }
    x += (x & -x);
  }
}
void update(int pos, int x, int y, long long val) {
  upd(pos, x + 1, y + 1, val);
}
long long get(int x, int y) {
  int pos = ((x & 1) << 1) + (y & 1);
  return query(pos, x, y);
}
void doit(int x, int y, long long val) {
  int pos = (((x + 1) & 1) << 1) + ((y + 1) & 1);
  update(pos, x + 1, y + 1, val);
}
int main() {
  int n, Q;
  while (scanf("%d", &n) == 1) {
    scanf("%d", &Q);
    for (int i = 0; i < Q; ++i) {
      int op;
      scanf("%d", &op);
      if (op == 1) {
        int X0, Y0, X1, Y1;
        scanf("%d", &X0), scanf("%d", &Y0), scanf("%d", &X1), scanf("%d", &Y1);
        X0--, Y0--, X1--, Y1--;
        long long ans = 0;
        ans ^= get(X1, Y1);
        ans ^= get(X0 - 1, Y1);
        ans ^= get(X1, Y0 - 1);
        ans ^= get(X0 - 1, Y0 - 1);
        printf("%I64d\n", ans);
      } else {
        int X0, Y0, X1, Y1;
        long long val;
        scanf("%d", &X0), scanf("%d", &Y0), scanf("%d", &X1), scanf("%d", &Y1);
        scanf("%I64d", &val);
        X0--, Y0--, X1--, Y1--;
        doit(X1, Y1, val);
        doit(X0 - 1, Y1, val);
        doit(X1, Y0 - 1, val);
        doit(X0 - 1, Y0 - 1, val);
      }
    }
  }
}
