#include <cstdio>
#include <cstring>
const int maxn = 600000;
struct node
{
    int x, y, z, f;
}a[maxn];
int k, w, tot, m, num, ans[11000], bh[maxn], d[10000000], g[maxn], t[10000000], now;
void addnew(int x, int y, int z, int xs)
{
    a[++num].x = x, a[num].y = y, a[num].z = z, a[num].f = xs;
}
void add(int x, int s)
{
    if (t[x += m] != now) t[x] = now, d[x] = s;
    else d[x] += s;
    for (x >>= 1; x > 0; x >>= 1)
    {
    if (t[x << 1] != now) t[x] = t[x << 1 ^ 1], d[x] = d[x << 1 ^ 1]; 
    else if (t[x << 1 ^ 1] != now) t[x] = t[x << 1], d[x] = d[x << 1];
    else d[x] = d[x << 1] + d[x << 1 ^ 1], t[x] = now;
    }
}
int ask(int l, int r)
{
    int mid = 0;
    if (l > r) return mid;
    for (l += m - 1, r += m + 1; (l ^ r) != 1; l >>= 1, r >>= 1)
    {
    if (!(l & 1) && (t[l + 1] == now)) mid += d[l + 1];
    if ((r & 1) && (t[r - 1] == now)) mid += d[r - 1];
    }
    return mid;
}
void work(int l, int r)
{
    if (l >= r) return;
    int mid = l + r >> 1, i, j;
    work(l, mid);
    work(mid + 1, r);
    g[0] = 0;
    for (j = l - 1, ++now, i = mid + 1; i <= r; ++i)
    {
    for (; j < mid && a[bh[j + 1]].x <= a[bh[i]].x;)
    {
        g[++g[0]] = bh[++j];
        if (!a[bh[j]].f) add(a[bh[j]].y, a[bh[j]].z);
    }
    g[++g[0]] = bh[i];
    if (a[bh[i]].f) ans[a[bh[i]].z] += ask(1, a[bh[i]].y) * a[bh[i]].f;
    }
    for (++j; j <= mid; g[++g[0]] = bh[j++]);
    for (i = 1; i <= g[0]; ++i) bh[l + i - 1] = g[i];
}
int main()
{
    freopen("mokia.in""r", stdin);
    freopen("mokia.out""w", stdout);
    int x, y, z, x1, y1, x2, y2;
    scanf("%d", &k);
    while (k != 3)
    {
    scanf("%d", &w);
    memset(ans, 0sizeof(ans));
    for (m = 1; m <= w + 1; m <<= 1);
    for (tot = num = 0; k != 3; )
    {
        scanf("%d", &k);
        if (!k || k == 3break;
        if (k == 1
        {
        scanf("%d%d%d", &x, &y, &z);
        addnew(x, y, z, 0);
        } else 
        {
        ++tot;
        scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
        addnew(x2, y2, tot, 1);
        if (x1 > 1 && y1 > 1) addnew(x1 - 1, y1 - 1, tot, 1);
        if (x1 > 1) addnew(x1 - 1, y2, tot, -1);
        if (y1 > 1) addnew(x2, y1 - 1, tot, -1);
        }
    }
    for (int i = 1; i <= num; bh[i] = i++);
    work(1, num);
    for (int i = 1; i <= tot; ++i) printf("%d\n", ans[i]);
    }
    return 0;
}