#include <bits/stdc++.h>
#define int long long
#define arr3 array <int , 3>
#define pii pair <int , int>
#define fi first
#define se second
using namespace std;
const int maxn = 1e5 + 7;
const int INF = 1e18;
struct Fenwick
{
vector <int> bit;
int n;
Fenwick(int sz){
n = sz;
bit.assign(sz+5 , 0ll);
}
void update(int pos , int val){
while(pos < n){
bit[pos] += val;
pos += (pos & (-pos));
}
}
int get(int pos){
int res = 0;
while(pos > 0){
res += bit[pos];
pos -= (pos & (-pos));
}
return res;
}
int get_range(int l , int r) {if(l > r) return 0; return get(r) - get(l-1);}
};
vector <int> val_x , val_y , val_z;
int get_x(int val) {return lower_bound(val_x.begin() , val_x.end() , val) - val_x.begin() + 1;}
int get_y(int val) {return lower_bound(val_y.begin() , val_y.end() , val) - val_y.begin() + 1;}
int get_z(int val) {return lower_bound(val_z.begin() , val_z.end() , val) - val_z.begin() + 1;}
struct query {int x , y , z;} Query[maxn];
int n , q , ans[maxn];
pii a[maxn];
vector <int> ask1[maxn] , ask2[maxn] , add2[maxn] , add1[maxn];
void solve()
{
cin >> n >> q;
for(int i = 1; i <= n; i++)
{
cin >> a[i].fi >> a[i].se;
val_x.push_back(a[i].fi);
val_y.push_back(a[i].se);
val_z.push_back(a[i].fi + a[i].se);
}
sort(val_x.begin() , val_x.end());
sort(val_y.begin() , val_y.end());
sort(val_z.begin() , val_z.end());
val_x.erase(unique(val_x.begin() , val_x.end()) , val_x.end());
val_y.erase(unique(val_y.begin() , val_y.end()) , val_y.end());
val_z.erase(unique(val_z.begin() , val_z.end()) , val_z.end());
for(int i = 1; i <= n; i++)
{
add2[get_z(a[i].fi + a[i].se)].push_back(i);
add1[get_x(a[i].fi)].push_back(i);
}
Fenwick BITx(maxn) , BITy(maxn);
Fenwick temp(maxn);
for(int i = 1; i <= q; i++)
{
cin >> Query[i].x >> Query[i].y >> Query[i].z;
auto [x , y , z] = Query[i];
if(x + y >= z) ask1[get_x(x)].push_back(i);
else ask2[get_z(z)].push_back(i);
}
int cur = 0;
for(int i = maxn - 1; i >= 0; i--)
{
for(auto id: add2[i])
{
BITx.update(get_x(a[id].fi) , 1);
BITy.update(get_y(a[id].se) , 1);
cur++;
}
for(auto id: ask2[i])
{
auto [x , y , z] = Query[id];
ans[id] = cur - BITx.get_range(1 , get_x(x) - 1) - BITy.get_range(1 , get_y(y) - 1);
}
}
for(int i = n; i >= 1; i--)
{
for(auto id: add1[i]) temp.update(get_y(a[id].se) , 1);
for(auto id: ask1[i]) ans[id] = temp.get_range(get_y(Query[id].y) , maxn);
}
for(int i = 1; i <= q; i++) cout << ans[i] << '\n';
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
solve();
return 0;
}
/*
TH1: A + B >= C
đếm có bao nhiêu thằng x >= A và có y >= B;
TH2: A + B < C
cur - có bao nhiêu thằng có tổng x+y >= C , mà y < B
- có bao nhiêu thằng có tổng x+y >= C , mà x < A
+ có bao nhiêu thằng có tổng x+y >= C , mà x < A và y < B (loại)
*/