#include<bits/stdc++.h>
using namespace std;
const int maxn = 8e4 + 5;
int st[12 * maxn], lazy[12 * maxn];
void push(int id){
if(lazy[id]){
st[id * 2] = st[id * 2 + 1] = st[id];
lazy[id * 2] = lazy[id * 2 + 1] = 1;
lazy[id] = 0;
}
}
void update(int id, int l, int r, int u, int v, int val){
if(v < l || r < u) return;
if(u <= l && r <= v){
st[id] = val;
lazy[id] = 1;
return;
}
push(id);
int mid = (l + r) / 2;
update(id * 2, l, mid, u, v, val);
update(id * 2 + 1, mid + 1, r, u, v, val);
}
int query(int id, int l, int r, int pos){
if (l == r) return st[id];
push(id);
int mid = (l + r) / 2;
if(pos <= mid) return query(id * 2, l, mid, pos);
return query(id * 2 + 1, mid + 1, r, pos);
}
vector<int> at[maxn], adj[maxn], col;
int last[maxn], ans[maxn], par[maxn];
int tin[maxn], out[maxn], timedfs;
void dfs(int u) {
tin[u] = timedfs + 1;
for(int c: at[u]){
timedfs++;
col.push_back(c);
}
for(int v: adj[u]) dfs(v);
out[u] = timedfs;
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n, m; cin >> n >> m;
vector<int> compressy;
vector<array<int, 3>> event;
vector<int> x1(n + 1), y1(n + 1), x2(n + 1), y2(n + 1);
for(int i = 1; i <= n; i++){
cin >> x1[i] >> y1[i] >> x2[i] >> y2[i];
event.push_back({x1[i], 0, i});
event.push_back({x2[i], 2, i});
compressy.push_back(y1[i]);
compressy.push_back(y2[i]);
}
vector<int> x(m + 1), y(m + 1), c(m + 1), compressc;
for(int i = 1; i <= m; i++){
cin >> x[i] >> y[i] >> c[i];
event.push_back({x[i], 1, i});
compressy.push_back(y[i]);
compressc.push_back(c[i]);
}
sort(event.begin(), event.end());
sort(compressc.begin(), compressc.end());
compressc.erase(unique(compressc.begin(), compressc.end()), compressc.end());
for(int i = 1; i <= m; i++) c[i] = lower_bound(compressc.begin(), compressc.end(), c[i]) - compressc.begin() + 1;
sort(compressy.begin(), compressy.end());
compressy.erase(unique(compressy.begin(), compressy.end()), compressy.end());
auto idy = [&](int y){
return lower_bound(compressy.begin(), compressy.end(), y) - compressy.begin();
};
int sz = compressy.size();
for(auto [x, type, i]: event){
if(type == 0){
par[i] = query(1, 0, sz - 1, idy(y1[i]));
update(1, 0, sz - 1, idy(y1[i]), idy(y2[i]), i);
}else if(type == 1) at[query(1, 0, sz - 1, idy(y[i]))].push_back(c[i]);
else update(1, 0, sz - 1, idy(y1[i]), idy(y2[i]), par[i]);
}
for(int i = 1; i <= n; i++) adj[par[i]].push_back(i);
dfs(0);
vector<array<int, 3>> qry;
for(int i = 1; i <= n; i++){
if(tin[i] <= out[i]) qry.push_back({out[i], tin[i], i});
}
sort(qry.begin(), qry.end());
vector<int> fenwick(timedfs + 1);
auto add = [&](int p, int v){
for (; p <= timedfs; p += p & -p) fenwick[p] += v;
};
auto get = [&](int p){
int sum = 0;
for (; p; p -= p & -p) sum += fenwick[p];
return sum;
};
for(int i = 1, j = 0; i <= timedfs; i++){
int c = col[i - 1];
if(last[c]) add(last[c], -1);
last[c] = i;
add(i, 1);
while(j < qry.size() && qry[j][0] == i){
ans[qry[j][2]] = get(i) - get(qry[j][1] - 1);
j++;
}
}
for(int i = 1; i <= n; i++) cout << ans[i] << "\n";
}