#include <bits/stdc++.h>
#pragma warning(disable : 4996)
using namespace std;
int n, q;
struct Q {
  int type;
  int dir, x, y, a;
  Q() {}
  Q(int type, int x, int y, int dir = 0, int a = 0) {
    this->type = type, this->x = x, this->y = y, this->dir = dir, this->a = a;
  }
} a[100005];
int S1 = 10010, S2 = 5010;
int it[10020][5020];
int ans[100005];
void update(int x, int y, int v) {
  int y1;
  while (x <= S1) {
    y1 = y;
    while (y1 <= S2) {
      it[x][y1] += v;
      y1 += (y1 & -y1);
    }
    x += (x & -x);
  }
}
int getsum(int x, int y) {
  int sum = 0, y1;
  while (x > 0) {
    y1 = y;
    while (y1 > 0) {
      sum += it[x][y1];
      y1 -= (y1 & -y1);
    }
    x -= (x & -x);
  }
  return sum;
}
int main() {
  int i, j, k;
  scanf("%d%d", &n, &q);
  for (i = 0; i < q; i++) {
    scanf("%d", &a[i].type);
    if (a[i].type == 1) {
      scanf("%d%d%d%d", &a[i].dir, &a[i].x, &a[i].y, &a[i].a);
      a[i].dir--;
      if (a[i].dir == 2)
        a[i].dir = 3;
      else if (a[i].dir == 3)
        a[i].dir = 2;
    } else {
      scanf("%d%d", &a[i].x, &a[i].y);
    }
  }
  for (i = 0; i < 4; i++) {
    memset(it, 0, sizeof(it));
    for (j = 0; j < q; j++) {
      if (a[j].type == 1 && !a[j].dir) {
        update(a[j].x, a[j].y, 1);
        update(a[j].x, a[j].y + a[j].a + 1, -1);
      } else if (a[j].type == 2) {
        ans[j] += getsum(a[j].x, a[j].y);
      }
    }
    memset(it, 0, sizeof(it));
    for (j = 0; j < q; j++) {
      if (a[j].type == 1 && !a[j].dir) {
        update(a[j].x + a[j].y + a[j].a + 1, a[j].y + a[j].a + 1, 1);
        update(a[j].x + a[j].y + a[j].a + 1, a[j].y, -1);
      } else if (a[j].type == 2) {
        ans[j] += getsum(a[j].x + a[j].y, a[j].y);
      }
    }
    for (j = 0; j < q; j++) {
      a[j].dir++, a[j].dir %= 4;
      tie(a[j].x, a[j].y) = make_pair(a[j].y, n + 1 - a[j].x);
    }
  }
  for (i = 0; i < q; i++)
    if (a[i].type == 2) printf("%d\n", ans[i]);
  return 0;
}
