#include <bits/stdc++.h>

using namespace std;

#define ll long long
const int INF=1e9;
const ll LINF=1e18,MOD=1e9+7,LOG=17;
const int SQ=317;
#define fi first
#define se second
#define pii pair<int,int>
#define pll pair<long long,long long>
#define mid ((l+r)/2)
#define sz(a) (int((a).size()))
#define all(a) a.begin(),a.end()
#define endl "\n"
#define PRINT(x) cerr<<#x<<'='<<x<<endl;
#define pb push_back
#define PRINTvec(niz) {cerr<<#niz<<"="; for(auto _i:niz) cerr<<_i<<" "; cerr<<endl; }

void Md(ll& x){
    if(x>=MOD) x%=MOD;
}

void Solve(){
    int N,Q; cin>>N>>Q;

    struct Interval{
        int l,r,idx;
        void PRINTinterval(){
            cerr<<"["<<l<<","<<r<<"]-"<<"["<<idx<<"]"<<endl;
        }
    };

    vector<Interval> a(N+1);
    vector<int> sve;
    for(int i=1;i<=N;i++){
        cin>>a[i].l>>a[i].r;
        a[i].idx=i;
        sve.pb(a[i].l); sve.pb(a[i].r);
    }

    struct Kveri{
        int l,r,x,idx;
        void PRINTkveri(){
            cerr<<"["<<l<<","<<r<<"]-"<<"["<<idx<<"]="<<x<<endl;
        }
    }; vector<Kveri> qs(Q);

    for(int i=0;i<Q;i++){
        cin>>qs[i].l>>qs[i].r>>qs[i].x;
        sve.pb(qs[i].x);
        qs[i].idx=i;
    }
    sort(all(sve));
    sve.resize(unique(all(sve))-sve.begin());
    int MAXV=0;
    for(int i=1;i<=N;i++){
        a[i].l=lower_bound(all(sve),a[i].l)-sve.begin()+1; MAXV=max(MAXV,a[i].l);
        a[i].r=lower_bound(all(sve),a[i].r)-sve.begin()+1; MAXV=max(MAXV,a[i].r);
    }
    for(int i=0;i<Q;i++){
        qs[i].x=lower_bound(all(sve),qs[i].x)-sve.begin()+1; MAXV=max(MAXV,qs[i].x);
    }

    vector<int> seg(4*(N+1)+1);

    function<void(int,int,int,int,int)> Update=[&](int node,int l,int r,int idx,int val){
        if(l==r){
            seg[node]+=val;
            return;
        }
        if(idx<=mid) Update(2*node,l,mid,idx,val);
        else Update(2*node+1,mid+1,r,idx,val);
        seg[node]=seg[2*node]+seg[2*node+1];
    };
    function<int(int,int,int,int,int)> Query=[&](int node,int l,int r,int L,int R){
        if(L>R) return 0;
        if(L<=l && r<=R) return seg[node];
        int ret=0;
        if(L<=mid) ret+=Query(2*node,l,mid,L,R);
        if(R>mid) ret+=Query(2*node+1,mid+1,r,L,R);
        return ret;
    };

    priority_queue<pii,vector<pii>,greater<pii>> Izbaci[MAXV+1];
    priority_queue<pii,vector<pii>> Ubaci[MAXV+1];
    vector<Kveri> qve[MAXV+1];
    for(int i=0;i<Q;i++){
        qve[qs[i].x].pb(qs[i]);
    }
    for(int i=1;i<=N;i++){
        Izbaci[a[i].r].push({a[i].l,a[i].idx});
        Ubaci[a[i].l].push({a[i].r,a[i].idx});
        if(a[i].l<=1 && a[i].r>=1){
            Update(1,1,N,a[i].idx,+1);
        }
    }
    vector<int> ans(Q);
    for(int x=1;x<=MAXV;x++){
        if(x>1){
            while(!Izbaci[x-1].empty() && Izbaci[x-1].top().fi<=x-1){
                Update(1,1,N,Izbaci[x-1].top().se,-1);
                Izbaci[x-1].pop();
            }
            while(!Ubaci[x].empty() && Ubaci[x].top().fi>=x){
                Update(1,1,N,Ubaci[x].top().se,+1);
                Ubaci[x].pop();
            }
        }
        for(auto q:qve[x]){
            ans[q.idx]=Query(1,1,N,q.l,q.r);
        }
    }
    for(int i=0;i<Q;i++){
        cout<<ans[i]<<endl;
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t; t=1;
    //cin>>t;;
    while(t--){
        Solve();
    }
    return 0;
}