#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, 0, sizeof(ans));
for (m = 1; m <= w + 1; m <<= 1);
for (tot = num = 0; k != 3; )
{
scanf("%d", &k);
if (!k || k == 3) break;
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;
}
#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, 0, sizeof(ans));
for (m = 1; m <= w + 1; m <<= 1);
for (tot = num = 0; k != 3; )
{
scanf("%d", &k);
if (!k || k == 3) break;
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;
}