#include <bits/stdc++.h>
using namespace std;
#define FNAME "test"
const int N = 1e5 + 5;
int n, q;
struct Data {
	int x, y, z;
	Data() : x(0), y(0), z(0) {}
	Data(int x, int y) : x(x), y(y), z(x + y) {}
	Data(int x, int y, int z) : x(x), y(y), z(z) {}
	void rev() {
		x = -x, y = -y, z = -z;
	}
};
Data student[N], query[N];
struct COORD {
	vector<int> data;
	COORD() {
		data.clear();
	}
	COORD(vector<int> data) : data(data) {}
	void add(int v) {
		data.push_back(v);
	}
	void compress() {
		sort(data.begin(), data.end());
		data.resize(unique(data.begin(), data.end()) - data.begin());
	}
	int size() {
		return (int) data.size();
	}
	int geq(int v) {
		return lower_bound(data.begin(), data.end(), v) - data.begin() + 1;
	}
	int leq(int v) {
		return upper_bound(data.begin(), data.end(), v) - data.begin();
	}
};
COORD X, Y, Z;
struct Event {
	int t;
	int x, y;
	int id;
	Event() {}
	Event(int t, int x, int y, int id) : t(t), x(x), y(y), id(id) {}
};
vector<Event> events[N * 2];
struct FenwickTree2D {
	int mxX, mxY;
	vector<COORD> nodes;
	vector<vector<int>> f;
	void init(int _mxX, int _mxY) {
		mxX = _mxX, mxY = _mxY;
		nodes.resize(_mxX + 1);
		f.resize(_mxX + 1);
	}
	void initNodes() {
		for (int x = 1; x <= mxX; x++) {
			nodes[x].compress();
			f[x].resize(nodes[x].size() + 1);
		}
	}
	void fakeUpdate(int x, int y) {
		for (; x <= mxX; x += x & (-x)) nodes[x].add(y);
	}
	void fakeGet(int x, int y) {
		for (; x > 0; x -= x & (-x)) nodes[x].add(y);
	}
	void update(int u, int v) {
		for (int x = u; x <= mxX; x += x & (-x))
			for (int y = nodes[x].geq(v); y <= nodes[x].size(); y += y & (-y))
				f[x][y]++;
	}
	int get(int u, int v) {
		int ret = 0;
		for (int x = u; x > 0; x -= x & (-x))
			for (int y = nodes[x].leq(v); y > 0; y -= y & (-y))
				ret += f[x][y];
		return ret;
	}
} BIT2D;
int ans[N];
void Task() {
	ios_base::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cout << fixed << setprecision(9);
	if (fopen(FNAME".inp","r")) {
		freopen(FNAME".inp","r",stdin);
		freopen(FNAME".out","w",stdout);
	}
}
void Input() {
	cin >> n >> q;
	for (int i = 1; i <= n; i++) {
		int a, b; cin >> a >> b;
		student[i] = Data(a, b);
	}
	for (int i = 1; i <= q; i++) {
		int alpha, beta, gamma;
		cin >> alpha >> beta >> gamma;
		query[i] = Data(alpha, beta, gamma);
	}
}
void compress() {
	for (int i = 1; i <= n; i++) student[i].rev();
	for (int i = 1; i <= n; i++) {
		X.add(student[i].x);
		Y.add(student[i].y);
		Z.add(student[i].z);
	}
	for (int i = 1; i <= q; i++) query[i].rev();
	for (int i = 1; i <= q; i++) {
		X.add(query[i].x);
		Y.add(query[i].y);
		Z.add(query[i].z);
	}
	X.compress();
	Y.compress();
	Z.compress();
	for (int i = 1; i <= n; i++) {
		student[i].x = X.geq(student[i].x);
		student[i].y = Y.geq(student[i].y);
		student[i].z = Z.geq(student[i].z);
	}
	for (int i = 1; i <= q; i++) {
		query[i].x = X.geq(query[i].x);
		query[i].y = Y.geq(query[i].y);
		query[i].z = Z.geq(query[i].z);
	}
}
void buildEvent() {
	for (int i = 1; i <= n; i++) events[student[i].z].push_back(Event(0, student[i].x, student[i].y, i));
	for (int i = 1; i <= q; i++) events[query[i].z].push_back(Event(1, query[i].x, query[i].y, i));
}
void solve() {
	BIT2D.init(X.size(), Y.size());
	for (int z = 1; z <= Z.size(); z++) {
		for (auto event : events[z]) {
			if (event.t == 0) BIT2D.fakeUpdate(event.x, event.y);
			if (event.t == 1) BIT2D.fakeGet(event.x, event.y);
		}
	}
	BIT2D.initNodes();
	for (int z = 1; z <= Z.size(); z++) {
		for (auto event : events[z]) {
			if (event.t == 0) BIT2D.update(event.x, event.y);
			if (event.t == 1) ans[event.id] = BIT2D.get(event.x, event.y);
		}
	}
	for (int i = 1; i <= q; i++) cout << ans[i] << '\n';
}
void Solve() {
	//Your Code
	Input();
	compress();
	buildEvent();
	solve();
}
int main() {
	Task();
	Solve();
	cerr << "\nTime run: " << 1000*clock()/CLOCKS_PER_SEC << "ms";
	return 37^37;
}
Compilation message (stderr)
examination.cpp: In function 'void Task()':
examination.cpp:120:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  120 |                 freopen(FNAME".inp","r",stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
examination.cpp:121:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  121 |                 freopen(FNAME".out","w",stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |