#include <bits/stdc++.h>
using namespace std;
struct BIT {
  vector<long long> bit;
  BIT() {
    bit.resize(1024);
    fill(bit.begin(), bit.end(), 0LL);
  }
  void add(int pos, long long val) {
    if (pos == 0) return;
    for (; pos < 1024; pos += (pos & (-pos))) bit[pos] ^= val;
  }
  long long _get(int to) {
    long long ret = 0;
    for (; to > 0; to -= (to & (-to))) ret ^= bit[to];
    return ret;
  }
  long long get(int lo, int hi) {
    if (lo > hi) return 0;
    return _get(hi) ^ _get(lo - 1);
  }
};
struct data1 {
  BIT end_pos;
  BIT sum_nech;
  void _add(int hi, long long how) {
    end_pos.add(hi, how);
    if (hi & 1) sum_nech.add(hi, how);
  }
  void add(int lo, int hi, long long how) {
    _add(hi, how);
    _add(lo - 1, how);
  }
  long long _get(int hi) {
    if (hi == 0) return 0;
    long long ret = 0;
    if (hi & 1) ret ^= end_pos.get(hi + 1, 1024 - 1);
    ret ^= sum_nech.get(1, hi);
    return ret;
  }
  long long get(int lo, int hi) { return _get(hi) ^ _get(lo - 1); }
};
int GLO, GHI;
long long HOW;
struct BIT2 {
  vector<data1> bit;
  BIT2() { bit.resize(1024); }
  void add(int pos) {
    if (pos == 0) return;
    for (; pos < 1024; pos += (pos & (-pos))) bit[pos].add(GLO, GHI, HOW);
  }
  long long _get(int to) {
    long long ret = 0;
    for (; to > 0; to -= (to & (-to))) ret ^= bit[to].get(GLO, GHI);
    return ret;
  }
  long long get(int lo, int hi) {
    if (lo > hi) return 0;
    return _get(hi) ^ _get(lo - 1);
  }
};
struct data2 {
  BIT2 end_pos;
  BIT2 sum_nech;
  void _add(int hi) {
    end_pos.add(hi);
    if (hi & 1) sum_nech.add(hi);
  }
  void add(int lo, int hi, int glo, int ghi, long long ghow) {
    GLO = glo, GHI = ghi, HOW = ghow;
    _add(hi);
    _add(lo - 1);
  }
  long long _get(int hi) {
    if (hi == 0) return 0;
    long long ret = 0;
    if (hi & 1) ret ^= end_pos.get(hi + 1, 1024 - 1);
    ret ^= sum_nech.get(1, hi);
    return ret;
  }
  long long get(int lo, int hi, int glo, int ghi) {
    GLO = glo, GHI = ghi;
    return _get(hi) ^ _get(lo - 1);
  }
};
data2 U;
int main() {
  int N, M;
  scanf("%d%d", &N, &M);
  for (int i = 0; i < M; ++i) {
    int op;
    scanf("%d", &op);
    int x1, y1, x2, y2;
    long long val;
    if (op == 2) {
      scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
      scanf("%Ld", &val);
      U.add(x1, x2, y1, y2, val);
    } else {
      scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
      printf(
          "%Ld"
          "\n",
          U.get(x1, x2, y1, y2));
    }
  }
  return 0;
}
