Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <cmath>
- #include <memory.h>
- #include <cstring>
- #include <algorithm>
- #include <vector>
- #include <queue>
- #include <map>
- #include <set>
- using namespace std;
- #define X first
- #define Y second
- #define pb push_back
- #define mp make_pair
- #define ppb pop_back
- #define sz(x) ((int)(x).size())
- #define all(x) (x).begin(), (x).end()
- typedef long long ll;
- typedef pair<int, int> pii;
- typedef vector<int> vi;
- typedef vector<ll> vl;
- typedef vector<bool> vb;
- typedef vector<pii> vii;
- typedef vector<vi> vvi;
- typedef vector<vb> vvb;
- vi h, in, out;
- vvi g, level;
- int cur, root;
- void DFS(int v) {
- in[v] = cur++;
- level[h[v]].pb(in[v]);
- for(int i = 0; i < sz(g[v]); i++) {
- h[g[v][i]] = h[v] + 1;
- DFS(g[v][i]);
- }
- out[v] = cur++;
- }
- int main() {
- int n;
- scanf("%d", &n);
- h = vi(n);
- in = vi(n);
- out = vi(n);
- g = vvi(n);
- level = vvi(n);
- for(int i = 0, x; i < n; i++) {
- scanf("%d", &x);
- if(x == -1) root = i;
- else g[--x].pb(i);
- }
- DFS(root);
- int m;
- scanf("%d", &m);
- for(int i = 0, v, k; i < m; i++) {
- scanf("%d%d", &v, &k);
- k += h[--v];
- if(k >= n) puts("0");
- else printf("%d\n", upper_bound(all(level[k]), out[v]) - lower_bound(all(level[k]), in[v]));
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement