#include <bits/stdc++.h>
using namespace std;
struct Rect {
long long A, B, C, D;
};
struct Shot {
long long x, y, col;
};
struct Event {
long long x;
int type; // 0=open, 1=query, 2=close
int id;
bool operator < (const Event& other) const {
if (x != other.x) return x < other.x;
return type < other.type;
}
};
struct Edge {
long long y;
int type; // 0=bottom, 1=top
int id;
bool operator < (const Edge& other) const {
if (y != other.y) return y < other.y;
if (type != other.type) return type < other.type;
return id < other.id;
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, M;
cin >> N >> M;
vector<Rect> rect(N + 1);
for (int i = 1; i <= N; i++) {
cin >> rect[i].A >> rect[i].B >> rect[i].C >> rect[i].D;
}
vector<Shot> shot(M + 1);
vector<long long> allColors;
for (int i = 1; i <= M; i++) {
cin >> shot[i].x >> shot[i].y >> shot[i].col;
allColors.push_back(shot[i].col);
}
sort(allColors.begin(), allColors.end());
allColors.erase(unique(allColors.begin(), allColors.end()), allColors.end());
vector<Event> events;
events.reserve(2 * N + M);
for (int i = 1; i <= N; i++) {
events.push_back({rect[i].A, 0, i});
events.push_back({rect[i].C, 2, i});
}
for (int i = 1; i <= M; i++) {
events.push_back({shot[i].x, 1, i});
}
sort(events.begin(), events.end());
vector<int> parent(N + 1, 0);
vector<int> hitSheet(M + 1, 0);
set<Edge> active;
for (auto &e : events) {
if (e.type == 0) {
int id = e.id;
auto it = active.lower_bound({rect[id].B, 1, -1});
if (it != active.end() && it->type == 1)
parent[id] = it->id;
else
parent[id] = 0;
active.insert({rect[id].B, 0, id});
active.insert({rect[id].D, 1, id});
}
else if (e.type == 1) {
int id = e.id;
auto it = active.lower_bound({shot[id].y, 1, -1});
if (it != active.end() && it->type == 1)
hitSheet[id] = it->id;
else
hitSheet[id] = 0;
}
else {
int id = e.id;
active.erase({rect[id].B, 0, id});
active.erase({rect[id].D, 1, id});
}
}
vector<vector<int>> g(N + 1);
for (int i = 1; i <= N; i++) {
g[parent[i]].push_back(i);
}
vector<pair<int,int>> occ;
occ.reserve(M);
for (int i = 1; i <= M; i++) {
int u = hitSheet[i];
if (u == 0) continue;
int c = lower_bound(allColors.begin(), allColors.end(),
shot[i].col) - allColors.begin();
occ.push_back({u, c});
}
sort(occ.begin(), occ.end());
occ.erase(unique(occ.begin(), occ.end()), occ.end());
vector<vector<int>> nodeColors(N + 1);
for (auto &p : occ) {
nodeColors[p.first].push_back(p.second);
}
vector<int> order;
order.reserve(N + 1);
vector<int> st;
st.push_back(0);
while (!st.empty()) {
int u = st.back();
st.pop_back();
order.push_back(u);
for (int v : g[u]) st.push_back(v);
}
vector<unordered_set<int>*> bag(N + 1, nullptr);
vector<long long> ans(N + 1, 0);
for (int i = (int)order.size() - 1; i >= 0; i--) {
int u = order[i];
auto *cur = new unordered_set<int>();
for (int c : nodeColors[u]) cur->insert(c);
for (int v : g[u]) {
auto *child = bag[v];
if (cur->size() < child->size())
swap(cur, child);
for (int x : *child)
cur->insert(x);
delete child;
}
bag[u] = cur;
ans[u] = (long long)cur->size();
}
for (int i = 1; i <= N; i++) {
cout << ans[i] << '\n';
}
delete bag[0];
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgUmVjdCB7CiAgICBsb25nIGxvbmcgQSwgQiwgQywgRDsKfTsKCnN0cnVjdCBTaG90IHsKICAgIGxvbmcgbG9uZyB4LCB5LCBjb2w7Cn07CgpzdHJ1Y3QgRXZlbnQgewogICAgbG9uZyBsb25nIHg7CiAgICBpbnQgdHlwZTsgLy8gMD1vcGVuLCAxPXF1ZXJ5LCAyPWNsb3NlCiAgICBpbnQgaWQ7CiAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IEV2ZW50JiBvdGhlcikgY29uc3QgewogICAgICAgIGlmICh4ICE9IG90aGVyLngpIHJldHVybiB4IDwgb3RoZXIueDsKICAgICAgICByZXR1cm4gdHlwZSA8IG90aGVyLnR5cGU7CiAgICB9Cn07CgpzdHJ1Y3QgRWRnZSB7CiAgICBsb25nIGxvbmcgeTsKICAgIGludCB0eXBlOyAvLyAwPWJvdHRvbSwgMT10b3AKICAgIGludCBpZDsKCiAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IEVkZ2UmIG90aGVyKSBjb25zdCB7CiAgICAgICAgaWYgKHkgIT0gb3RoZXIueSkgcmV0dXJuIHkgPCBvdGhlci55OwogICAgICAgIGlmICh0eXBlICE9IG90aGVyLnR5cGUpIHJldHVybiB0eXBlIDwgb3RoZXIudHlwZTsKICAgICAgICByZXR1cm4gaWQgPCBvdGhlci5pZDsKICAgIH0KfTsKCmludCBtYWluKCkgewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKCiAgICBpbnQgTiwgTTsKICAgIGNpbiA+PiBOID4+IE07CgogICAgdmVjdG9yPFJlY3Q+IHJlY3QoTiArIDEpOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gTjsgaSsrKSB7CiAgICAgICAgY2luID4+IHJlY3RbaV0uQSA+PiByZWN0W2ldLkIgPj4gcmVjdFtpXS5DID4+IHJlY3RbaV0uRDsKICAgIH0KCiAgICB2ZWN0b3I8U2hvdD4gc2hvdChNICsgMSk7CiAgICB2ZWN0b3I8bG9uZyBsb25nPiBhbGxDb2xvcnM7CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gTTsgaSsrKSB7CiAgICAgICAgY2luID4+IHNob3RbaV0ueCA+PiBzaG90W2ldLnkgPj4gc2hvdFtpXS5jb2w7CiAgICAgICAgYWxsQ29sb3JzLnB1c2hfYmFjayhzaG90W2ldLmNvbCk7CiAgICB9CgogICAgc29ydChhbGxDb2xvcnMuYmVnaW4oKSwgYWxsQ29sb3JzLmVuZCgpKTsKICAgIGFsbENvbG9ycy5lcmFzZSh1bmlxdWUoYWxsQ29sb3JzLmJlZ2luKCksIGFsbENvbG9ycy5lbmQoKSksIGFsbENvbG9ycy5lbmQoKSk7CgogICAgdmVjdG9yPEV2ZW50PiBldmVudHM7CiAgICBldmVudHMucmVzZXJ2ZSgyICogTiArIE0pOwoKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IE47IGkrKykgewogICAgICAgIGV2ZW50cy5wdXNoX2JhY2soe3JlY3RbaV0uQSwgMCwgaX0pOwogICAgICAgIGV2ZW50cy5wdXNoX2JhY2soe3JlY3RbaV0uQywgMiwgaX0pOwogICAgfQoKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IE07IGkrKykgewogICAgICAgIGV2ZW50cy5wdXNoX2JhY2soe3Nob3RbaV0ueCwgMSwgaX0pOwogICAgfQoKICAgIHNvcnQoZXZlbnRzLmJlZ2luKCksIGV2ZW50cy5lbmQoKSk7CgogICAgdmVjdG9yPGludD4gcGFyZW50KE4gKyAxLCAwKTsKICAgIHZlY3RvcjxpbnQ+IGhpdFNoZWV0KE0gKyAxLCAwKTsKCiAgICBzZXQ8RWRnZT4gYWN0aXZlOwoKICAgIGZvciAoYXV0byAmZSA6IGV2ZW50cykgewogICAgICAgIGlmIChlLnR5cGUgPT0gMCkgewogICAgICAgICAgICBpbnQgaWQgPSBlLmlkOwoKICAgICAgICAgICAgYXV0byBpdCA9IGFjdGl2ZS5sb3dlcl9ib3VuZCh7cmVjdFtpZF0uQiwgMSwgLTF9KTsKCiAgICAgICAgICAgIGlmIChpdCAhPSBhY3RpdmUuZW5kKCkgJiYgaXQtPnR5cGUgPT0gMSkKICAgICAgICAgICAgICAgIHBhcmVudFtpZF0gPSBpdC0+aWQ7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHBhcmVudFtpZF0gPSAwOwoKICAgICAgICAgICAgYWN0aXZlLmluc2VydCh7cmVjdFtpZF0uQiwgMCwgaWR9KTsKICAgICAgICAgICAgYWN0aXZlLmluc2VydCh7cmVjdFtpZF0uRCwgMSwgaWR9KTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZS50eXBlID09IDEpIHsKICAgICAgICAgICAgaW50IGlkID0gZS5pZDsKCiAgICAgICAgICAgIGF1dG8gaXQgPSBhY3RpdmUubG93ZXJfYm91bmQoe3Nob3RbaWRdLnksIDEsIC0xfSk7CgogICAgICAgICAgICBpZiAoaXQgIT0gYWN0aXZlLmVuZCgpICYmIGl0LT50eXBlID09IDEpCiAgICAgICAgICAgICAgICBoaXRTaGVldFtpZF0gPSBpdC0+aWQ7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGhpdFNoZWV0W2lkXSA9IDA7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpbnQgaWQgPSBlLmlkOwogICAgICAgICAgICBhY3RpdmUuZXJhc2Uoe3JlY3RbaWRdLkIsIDAsIGlkfSk7CiAgICAgICAgICAgIGFjdGl2ZS5lcmFzZSh7cmVjdFtpZF0uRCwgMSwgaWR9KTsKICAgICAgICB9CiAgICB9CgogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBnKE4gKyAxKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IE47IGkrKykgewogICAgICAgIGdbcGFyZW50W2ldXS5wdXNoX2JhY2soaSk7CiAgICB9CgogICAgdmVjdG9yPHBhaXI8aW50LGludD4+IG9jYzsKICAgIG9jYy5yZXNlcnZlKE0pOwoKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IE07IGkrKykgewogICAgICAgIGludCB1ID0gaGl0U2hlZXRbaV07CiAgICAgICAgaWYgKHUgPT0gMCkgY29udGludWU7CgogICAgICAgIGludCBjID0gbG93ZXJfYm91bmQoYWxsQ29sb3JzLmJlZ2luKCksIGFsbENvbG9ycy5lbmQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3RbaV0uY29sKSAtIGFsbENvbG9ycy5iZWdpbigpOwoKICAgICAgICBvY2MucHVzaF9iYWNrKHt1LCBjfSk7CiAgICB9CgogICAgc29ydChvY2MuYmVnaW4oKSwgb2NjLmVuZCgpKTsKICAgIG9jYy5lcmFzZSh1bmlxdWUob2NjLmJlZ2luKCksIG9jYy5lbmQoKSksIG9jYy5lbmQoKSk7CgogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBub2RlQ29sb3JzKE4gKyAxKTsKICAgIGZvciAoYXV0byAmcCA6IG9jYykgewogICAgICAgIG5vZGVDb2xvcnNbcC5maXJzdF0ucHVzaF9iYWNrKHAuc2Vjb25kKTsKICAgIH0KCiAgICB2ZWN0b3I8aW50PiBvcmRlcjsKICAgIG9yZGVyLnJlc2VydmUoTiArIDEpOwoKICAgIHZlY3RvcjxpbnQ+IHN0OwogICAgc3QucHVzaF9iYWNrKDApOwoKICAgIHdoaWxlICghc3QuZW1wdHkoKSkgewogICAgICAgIGludCB1ID0gc3QuYmFjaygpOwogICAgICAgIHN0LnBvcF9iYWNrKCk7CgogICAgICAgIG9yZGVyLnB1c2hfYmFjayh1KTsKCiAgICAgICAgZm9yIChpbnQgdiA6IGdbdV0pIHN0LnB1c2hfYmFjayh2KTsKICAgIH0KCiAgICB2ZWN0b3I8dW5vcmRlcmVkX3NldDxpbnQ+Kj4gYmFnKE4gKyAxLCBudWxscHRyKTsKICAgIHZlY3Rvcjxsb25nIGxvbmc+IGFucyhOICsgMSwgMCk7CgogICAgZm9yIChpbnQgaSA9IChpbnQpb3JkZXIuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICBpbnQgdSA9IG9yZGVyW2ldOwoKICAgICAgICBhdXRvICpjdXIgPSBuZXcgdW5vcmRlcmVkX3NldDxpbnQ+KCk7CgogICAgICAgIGZvciAoaW50IGMgOiBub2RlQ29sb3JzW3VdKSBjdXItPmluc2VydChjKTsKCiAgICAgICAgZm9yIChpbnQgdiA6IGdbdV0pIHsKICAgICAgICAgICAgYXV0byAqY2hpbGQgPSBiYWdbdl07CgogICAgICAgICAgICBpZiAoY3VyLT5zaXplKCkgPCBjaGlsZC0+c2l6ZSgpKQogICAgICAgICAgICAgICAgc3dhcChjdXIsIGNoaWxkKTsKCiAgICAgICAgICAgIGZvciAoaW50IHggOiAqY2hpbGQpCiAgICAgICAgICAgICAgICBjdXItPmluc2VydCh4KTsKCiAgICAgICAgICAgIGRlbGV0ZSBjaGlsZDsKICAgICAgICB9CgogICAgICAgIGJhZ1t1XSA9IGN1cjsKICAgICAgICBhbnNbdV0gPSAobG9uZyBsb25nKWN1ci0+c2l6ZSgpOwogICAgfQoKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IE47IGkrKykgewogICAgICAgIGNvdXQgPDwgYW5zW2ldIDw8ICdcbic7CiAgICB9CgogICAgZGVsZXRlIGJhZ1swXTsKICAgIHJldHVybiAwOwp9