#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;   }