/**
* author: marcus06
* created: 09-05-2026 12:53:45
**/
#include <bits/stdc++.h>
using namespace std;
using lli = long long;
template <typename T>
void removeDuplicate(vector <T> &v) {
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
}
struct fenwick_tree {
int n;
vector <int> t;
fenwick_tree() {}
fenwick_tree(int _n): n(_n) {
t.resize(n + 5);
}
void update(int x, int value) {
for (; x <= n; x += x & -x) t[x] += value;
}
int query(int x) {
int res = 0;
for (; x > 0; x -= x & -x) res += t[x];
return res;
}
int suffix(int x) {
return query(n) - query(x - 1);
}
};
/*
* type == 0: Point
* type == 1: Query
*/
struct Data {
int x, y, z, id, type;
Data() {}
Data(int _x, int _y, int _z, int _id, int _type): x(_x), y(_y), z(_z), id(_id), type(_type) {}
};
bool byX(const Data& a, const Data& b) {
if (a.x == b.x) return a.type < b.type;
return a.x > b.x;
}
bool byY(const Data& a, const Data& b) {
if (a.y == b.y) return a.type < b.type;
return a.y > b.y;
}
vector <int> vals;
int getID(int x) {
return lower_bound(vals.begin(), vals.end(), x) - vals.begin() + 1;
}
const int MAX = int(1e5) + 5;
fenwick_tree bit;
vector <Data> dih;
int ans[MAX];
void CDQ(int l, int r) {
if (r - l <= 1) return;
int mid = (l + r) >> 1;
CDQ(l, mid); CDQ(mid, r);
vector <Data> L, R;
for (int i = l; i < mid; ++i) {
if (dih[i].type == 0) L.emplace_back(dih[i]);
}
for (int i = mid; i < r; ++i) {
if (dih[i].type == 1) R.emplace_back(dih[i]);
}
sort(L.begin(), L.end(), byY);
sort(R.begin(), R.end(), byY);
int p = 0;
for (int i = 0; i < (int) R.size(); ++i) {
while (p < (int) L.size() && L[p].y >= R[i].y) {
bit.update(L[p].z, 1);
p++;
}
ans[R[i].id] += bit.suffix(R[i].z);
}
for (int i = 0; i < p; ++i) bit.update(L[i].z, -1);
}
void solve() {
int N, Q;
cin >> N >> Q;
for (int i = 0; i < N; ++i) {
int x, y; cin >> x >> y;
dih.emplace_back(Data(x, y, x + y, -1, 0));
vals.emplace_back(x + y);
}
for (int i = 0; i < Q; ++i) {
int X, Y, Z;
cin >> X >> Y >> Z;
dih.emplace_back(Data(X, Y, Z, i, 1));
vals.emplace_back(Z);
}
sort(dih.begin(), dih.end(), byX);
removeDuplicate(vals);
for (auto& e: dih) e.z = getID(e.z);
bit = fenwick_tree(vals.size());
CDQ(0, dih.size());
for (int i = 0; i < Q; ++i) cout << ans[i] << '\n';
}
int main() {
std::cin.tie(0)->sync_with_stdio(0);
#ifdef LOCAL
auto begin = std::chrono::high_resolution_clock::now();
#endif
int tt = 1;
while (tt--) {
solve();
}
#ifdef LOCAL
auto end = std::chrono::high_resolution_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);
std::cerr << "Time measured: " << elapsed.count() * 1e-9 << " seconds.\n";
#endif
return 0;
}