#include <bits/stdc++.h>

using namespace std;

const int N = 200010;
int pref[21][N];
struct vaga{
	int f;
	int s;
	int index;
};
bool structsort(vaga A, vaga B){
	if(A.f<B.f){
		return true;
	}
	else return false;
}
bool structsort2(vaga A, vaga B){
	if(A.f==B.f){
		return A.index<B.index;
	}
	else return A.f<B.f;
}
vaga a[N];
bool exs(int x, int l, int r){
	while(l<=r){
		int s=(l+r)/2;
		if(a[s].f==x){
			return true;
		}
		else if(a[s].f>x){
			r=s-1;
		}
		else{
			l=s+1;
		}
	}
	return false;
}
int findl(int x, int l, int r){
	int ret=r;
	while(l<=r){
		int s=(l+r)/2;
		if(a[s].f>x){
			r=s-1;
		}
		else if(a[s].f<x){
			l=s+1;
		}
		else{
			ret=min(ret, s);
			r=s-1;
		}
	}
	return ret;
}
int findr(int x, int l, int r){
	int ret=0;
	while(l<=r){
		int s=(l+r)/2;
		if(a[s].f>x){
			r=s-1;
		}
		else if(a[s].f<x){
			l=s+1;
		}
		else{
			ret=max(ret, s);
			l=s+1;
		}
	}
	return ret;
}
int findL(int L, int R, int l, int r){
	int ret=1e9;
	while(L<=R){
		int s=(L+R)/2;
		if(a[s].index>r){
			R=s-1;
		}
		else if(a[s].index<l){
			L=s+1;
		}
		else{
			R=s-1;
			ret=min(ret, s);
		}
	}
	return ret;
}
int findR(int L, int R, int l, int r){
	int ret=L;
	while(L<=R){
		int s=(L+R)/2;
		if(a[s].index>r){
			R=s-1;
		}
		else if(a[s].index<l){
			L=s+1;
		}
		else{
			ret=max(s, ret);
			L=s+1;
		}
	}
	return ret;
}
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n, m;
	cin >> n >> m;
	if(n<=1010 && m<=1010){
		for(int i=0; i< n; i++){
			int l, r;
			cin >> l >> r;
			a[i].f=l;
			a[i].s=r;
			a[i].index=i;
		}
		while(m--){
			int x, l, r;
			cin>> l >> r >> x;
			int ans=0;
			for(int i=l-1; i <r; i++){
				if(a[i].f<=x && a[i].s>=x){
					ans++;
				}
			}
			cout << ans << '\n';
		}
	}
	else{
		bool drugi_subtask=true;
		bool cetvrti_subtask=true;
		for(int i=0; i< n; i++){
			int l, r;
			cin >> l >> r;
			a[i].f=l;
			a[i].s=r;
			a[i].index=i;
			if(l!=r){
				drugi_subtask=false;
			}
			if(r>20){
				cetvrti_subtask=false;
			}
		}
		if(drugi_subtask==false && cetvrti_subtask==false){
			sort(a, a+n, structsort);
			while(m--){
				int l, r, x;
				cin >> l >> r >> x;
				int ind=-1;
				int L=0;
				int R=n-1;
				while(L<=R){
					int S=(L+R)/2;
					if(a[S].f<=x && a[S].s>=x){
						ind=a[S].index;
						break;
					}
					else{
						if(a[S].s<x){
							L=S+1;
						}
						else if(a[S].f>x){
							R=S-1;
						}
					}
				}
				if(ind+1>=l && ind+1<=r){
					cout << 1 << '\n';
				}
				else cout << 0 << '\n';
			}
		}
		else if(drugi_subtask==true){
			sort(a, a+n, structsort2);
			while(m--){
				int l, r, x;
				cin >> l >> r >> x;
				l--;
				r--;
				if(exs(x, 0, n-1)){
					int L=findl(x, 0, n-1);
					int R=findr(x, 0, n-1);
					int L1=findL(L, R, l, r);
					int R1=findR(L, R, l, r);
					cout << max(R1- L1+1, 0) << '\n';
				}
				else{
					cout << 0 << '\n';
				}
			}
		}
		else{
			for(int i =0; i< 21; i++){
				pref[i][0]=0;
			}
			for(int i=0; i<21; i++){
				for(int j=1; j<=n; j++){
					pref[i][j]=pref[i][j-1];
					if(a[j-1].f<=i && a[j-1].s>=i){
						pref[i][j]++;
					}
				}
			}
			while(m--){
				int l, r, x;
				cin >> l >> r >> x;
				if(x>20){
					cout << 0 << '\n';
				}
				else{
					cout << pref[x][r]-pref[x][l-1] << '\n';
				}
			}
		}
	}
}