/**
 * Author: Sergey Kopeliovich (Burunduk30@gmail.com)
 */

#include <bits/stdc++.h>

#define fora(i, n) for (int i = 1; i <= (int)(n); i++)

using namespace std;

const int N = 3e5 + 3, Q = 11;

vector<int> c[N];
int root, l, r, n, q, ans[Q][N], color[N];

void dfs( int j, int v ) {
	ans[j][v] = (l <= color[v] && color[v] <= r);
	for (int x : c[v])
		dfs(j, x), ans[j][v] += ans[j][x];
}

int main() {
	#define NAME "segments"
	ifstream cin(NAME ".in");
	ofstream cout(NAME ".out");

	cin >> n >> q;
	fora(i, n) {
		int p;
		cin >> p >> color[i];
		if (!p)
			root = i;
		else
			c[p].push_back(i);
	}
	fora(j, q) {
		cin >> l >> r;
		dfs(j, root);
	}
	fora(i, n)
		fora(j, q)
			cout << ans[j][i] << " \n"[j == q];
	return 0;
}