#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010, M = 200010;
int n, m;
struct Info {
int a, b, c, s, res;
bool operator<(const Info& W) const {
if (a != W.a) return a < W.a;
if (b != W.b) return b < W.b;
return c < W.c;
}
bool operator==(const Info& W) const {
return a == W.a && b == W.b && c == W.c;
}
}w[N], t[N];
int ans[N], tr[M];
void add(int x, int v) {
for (x; x < M; x += x & -x) tr[x] += v;
}
int query(int x) {
int res = 0;
for (; x; x -= x & -x) res += tr[x];
return res;
}
void cdq(int l, int r) {
if (l >= r) return ;
int mid = l + r >> 1;
cdq(l, mid), cdq(mid + 1, r);
int i = l, j = mid + 1, k = 0;
while (i <= mid && j <= r)
if (w[i].b <= w[j].b) add(w[i].c, w[i].s), t[k ++ ] = w[i ++ ];
else w[j].res += query(w[j].c), t[k ++ ] = w[j ++ ];
while (i <= mid) add(w[i].c, w[i].s), t[k ++ ] = w[i ++ ];
while (j <= r) w[j].res += query(w[j].c), t[k ++ ] = w[j ++ ];
for (i = l; i <= mid; i ++ ) add(w[i].c, -w[i].s);
for (i = l, j = 0; j < k; i ++ , j ++ ) w[i] = t[j];
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i ++ )
scanf("%d%d%d", &w[i].a, &w[i].b, &w[i].c), w[i].s = 1;
sort(w, w + n);
int k = 1;
for (int i = 1; i < n; i ++ )
if (w[i] == w[k - 1]) w[k - 1].s ++ ;
else w[k ++ ] = w[i];
cdq(0, k - 1);
for (int i = 0; i < k; i ++ )
ans[w[i].res + w[i].s - 1] += w[i].s;
for (int i = 0; i < n; i ++ ) printf("%d\n", ans[i]);
return 0;
}
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long i64;
const int N = 500010;
int n, m;
i64 ans[N];
struct Date {
int x, y, z, w, id, sign;
i64 sum = 0;
bool operator<(const Date &W) const {
if (x != W.x) return x < W.x;
if (y != W.y) return y < W.y;
return z < W.z;
}
}q[N], t[N];
void cdq(int l, int r) {
if (l >= r) return ;
int mid = l + r >> 1;
cdq(l, mid), cdq(mid + 1, r);
int i = l, j = mid + 1, k = 0;
i64 sum = 0;
while (i <= mid && j <= r) {
if (q[i].y <= q[j].y) sum += q[i].w, t[k ++ ] = q[i ++ ];
else q[j].sum += sum, t[k ++ ] = q[j ++ ];
}
while (i <= mid) sum += q[i].w, t[k ++ ] = q[i ++ ];
while (j <= r) q[j].sum += sum, t[k ++ ] = q[j ++ ];
for (int i = l, j = 0; j < k; i ++ , j ++ ) q[i] = t[j];
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i ++ ) {
int x, y, w;
scanf("%d%d%d", &x, &y, &w);
q[i] = {x, y, 0, w};
}
int k = n;
for (int i = 1; i <= m; i ++ ) {
int x1, y1, x2, y2;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
q[k ++ ] = {x2, y2, 1, 0, i, 1, 0};
q[k ++ ] = {x1 - 1, y2, 1, 0, i, -1, 0};
q[k ++ ] = {x2, y1 - 1, 1, 0, i, -1, 0};
q[k ++ ] = {x1 - 1, y1 - 1, 1, 0, i, 1, 0};
}
sort(q, q + k);
cdq(0, k - 1);
for (int i = 0; i < k; i ++ )
if (q[i].z) ans[q[i].id] += q[i].sign * q[i].sum;
for (int i = 1; i <= m; i ++ ) printf("%lld\n", ans[i]);
return 0;
}