#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int v = 0, f = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    v = v * 10 + c - '0';
    c = getchar();
  }
  return v * f;
}
const int Maxn = 100005;
int bit[5005][10005];
int bt[10005];
void Add(int x) {
  assert(x);
  while (x < 10005) {
    bt[x]++;
    x += x & -x;
  }
}
int Query(int x) {
  int ans = 0;
  while (x) {
    ans += bt[x];
    x -= x & -x;
  }
  return ans;
}
void add(int x, int y) {
  assert(x && y);
  for (int i = x; i < 5005; i += i & -i) {
    for (int j = y; j < 10005; j += j & -j) {
      bit[i][j]++;
    }
  }
}
int query(int x, int y) {
  int ret = 0;
  for (int i = x; i; i -= i & -i) {
    for (int j = y; j; j -= j & -j) {
      ret += bit[i][j];
    }
  }
  return ret;
}
int dir[Maxn], x[Maxn], y[Maxn], len[Maxn];
int ans[Maxn];
int n, q;
void Rot() {
  for (int i = 0; i < q; i++) {
    swap(x[i], y[i]);
    x[i] = -x[i];
  }
  int Minx = 1e9, Miny = 1e9;
  for (int i = 0; i < q; i++) {
    Minx = min(Minx, x[i]);
    Miny = min(Miny, y[i]);
  }
  for (int i = 0; i < q; i++) {
    x[i] = x[i] - Minx + 1;
    y[i] = y[i] - Miny + 1;
  }
}
void Solve(int D) {
  int cnt = 0;
  for (int i = 0; i < q; i++) {
    if (dir[i] == D) {
      cnt++;
    } else if (dir[i] == -1) {
      ans[i] += cnt;
    }
  }
  memset(bt, 0, sizeof(bt));
  for (int i = 0; i < q; i++) {
    if (dir[i] == D) {
      Add(5001 - (x[i] - 1));
    } else if (dir[i] == -1) {
      ans[i] -= Query(5001 - (x[i]));
    }
  }
  memset(bt, 0, sizeof(bt));
  for (int i = 0; i < q; i++) {
    if (dir[i] == D) {
      Add(5001 - (y[i] - 1));
    } else if (dir[i] == -1) {
      ans[i] -= Query(5001 - y[i]);
    }
  }
  memset(bt, 0, sizeof(bt));
  for (int i = 0; i < q; i++) {
    if (dir[i] == D) {
      Add(x[i] + y[i] + len[i] + 1);
    } else if (dir[i] == -1) {
      ans[i] -= Query(x[i] + y[i]);
    }
  }
  memset(bit, 0, sizeof(bit));
  for (int i = 0; i < q; i++) {
    if (dir[i] == D) {
      add(5001 - (x[i] - 1), 5001 - (y[i] - 1));
    } else if (dir[i] == -1) {
      ans[i] += query(5001 - x[i], 5001 - y[i]);
    }
  }
  memset(bit, 0, sizeof(bit));
  for (int i = 0; i < q; i++) {
    if (dir[i] == D) {
      add(5001 - (x[i] - 1), x[i] + y[i] + len[i] + 1);
    } else if (dir[i] == -1) {
      ans[i] += query(5001 - x[i], x[i] + y[i]);
    }
  }
  memset(bit, 0, sizeof(bit));
  for (int i = 0; i < q; i++) {
    if (dir[i] == D) {
      add(5001 - (y[i] - 1), x[i] + y[i] + len[i] + 1);
    } else if (dir[i] == -1) {
      ans[i] += query(5001 - y[i], x[i] + y[i]);
    }
  }
}
int main() {
  scanf("%d %d", &n, &q);
  for (int i = 0; i < q; i++) {
    int tp;
    scanf("%d", &tp);
    if (tp == 1) {
      scanf("%d %d %d %d", &dir[i], &x[i], &y[i], &len[i]);
      if (dir[i] >= 3) dir[i] = 7 - dir[i];
    } else {
      scanf("%d %d", &x[i], &y[i]);
      dir[i] = -1;
    }
  }
  for (int i = 1; i <= 4; i++) {
    Solve(i);
    Rot();
  }
  for (int i = 0; i < q; i++) {
    if (dir[i] == -1) {
      printf("%d\n", ans[i]);
    }
  }
  return 0;
}
