/**
* 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;
}