#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "algos/debug.h"
#else
#define debug(...) 42;
#endif
#define all(x) (x).begin(), (x).end()
#define isz(x) (int)x.size()
// #define int long long
const int sz = 2e5 + 1, inf = 1e9, mod = 1e9 + 7;
struct MergeSortTree {
vector<vector<int>> st;
vector<int> a;
MergeSortTree(int n, vector<int> b) {
st.resize(n * 4 + 1);
a.resize(n + 1);
for (int i = 0; i <= n; i++)
a[i] = b[i];
}
void build(int l, int r, int v) {
if (l == r) {
st[v].push_back(a[l]);
return;
}
int mid = (l + r) >> 1;
build(l, mid, v << 1);
build(mid + 1, r, v << 1 | 1);
merge(all(st[v << 1]), all(st[v << 1 | 1]), back_inserter(st[v]));
}
int getans(int ql, int qr, int l, int r, int val, int v) {
if (ql > r || l > qr)
return 0;
if (ql <= l && r <= qr) {
auto it = lower_bound(all(st[v]), val);
return st[v].end() - it;
}
int mid = (l + r) >> 1;
return getans(ql, qr, l, mid, val, v << 1) +
getans(ql, qr, mid + 1, r, val, v << 1 | 1);
}
};
void run(int tc) {
int n, q;
cin >> n >> q;
vector<array<int, 2>> a(n + 1);
vector<int> l(n + 1), r(n + 1), s(n + 1);
for (int i = 1; i <= n; i++) {
cin >> a[i][0] >> a[i][1];
}
sort(all(a));
for (int i = 1; i <= n; i++) {
l[i] = a[i][0];
r[i] = a[i][1];
s[i] = l[i] + r[i];
}
MergeSortTree t1(n + 1, r);
MergeSortTree t2(n + 1, s);
t1.build(1, n, 1);
t2.build(1, n, 1);
while (q--) {
int x, y, z;
cin >> x >> y >> z;
auto it = lower_bound(l.begin() + 1, l.begin() + 1 + n, x) - l.begin();
auto jt = n - t1.getans(it, n, 1, n, y, 1) + 1;
// debug(it, jt);
int ans = t2.getans(jt, n, 1, n, z, 1);
cout << ans << '\n';
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
// cin >> t;
for (int tc = 1; tc <= t; tc++)
run(tc);
}