#include <bits/stdc++.h>
using namespace std;
int N, M;
int _next[10000000];
struct event {
  int l, r, x;
  event() {}
  event(int l, int r, int x) : l(l), r(r), x(x) {}
};
vector<event> e[7005];
inline bool cross(int l1, int r1, int l2, int r2) {
  if (l1 > r2) return false;
  if (r1 < l2) return false;
  return true;
}
int main() {
  for (int i = 1; i < (1 << 21) - 1; i++) {
    _next[i] = 1;
  }
  for (int i = 0; i < 21; i++) {
    _next[1 << i]++;
  }
  for (int i = 2; i < (1 << 21) - 1; i++) {
    _next[i] += _next[i - 1];
  }
  cin >> N;
  cin >> M;
  int t, v;
  int n, l, r, x;
  for (int i = 0; i < M; i++) {
    cin >> t;
    if (t == 1) {
      cin >> n >> l >> r >> x;
      e[n].push_back(event(l, r, x));
    } else {
      set<int> S;
      cin >> n >> v;
      l = v - 1, r = v;
      for (int i = n; i <= N; i++) {
        for (int j = 0; j < e[i].size(); j++) {
          if (cross(l + 1, r, e[i][j].l, e[i][j].r)) S.insert(e[i][j].x);
        }
        l = _next[l], r = _next[r];
      }
      cout << S.size() << endl;
    }
  }
  return 0;
}
