Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2011
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.32 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <memory.h>
  6. #include <cstring>
  7. #include <algorithm>
  8. #include <vector>
  9. #include <queue>
  10. #include <map>
  11. #include <set>
  12.  
  13. using namespace std;
  14.  
  15. #define X first
  16. #define Y second
  17. #define pb push_back
  18. #define mp make_pair
  19. #define ppb pop_back
  20. #define sz(x) ((int)(x).size())
  21. #define all(x) (x).begin(), (x).end()
  22.  
  23. typedef long long ll;
  24. typedef pair<int, int> pii;
  25. typedef vector<int> vi;
  26. typedef vector<ll> vl;
  27. typedef vector<bool> vb;
  28. typedef vector<pii> vii;
  29. typedef vector<vi> vvi;
  30. typedef vector<vb> vvb;
  31.  
  32. vi h, in, out;
  33. vvi g, level;
  34. int cur, root;
  35.  
  36. void DFS(int v) {
  37.     in[v] = cur++;
  38.     level[h[v]].pb(in[v]);
  39.     for(int i = 0; i < sz(g[v]); i++) {
  40.         h[g[v][i]] = h[v] + 1;
  41.         DFS(g[v][i]);  
  42.     }
  43.     out[v] = cur++;
  44. }
  45.  
  46. int main() {
  47.     int n;
  48.    scanf("%d", &n);
  49.    h = vi(n);
  50.    in = vi(n);
  51.    out = vi(n);
  52.    g = vvi(n);
  53.    level = vvi(n);
  54.    for(int i = 0, x; i < n; i++) {
  55.     scanf("%d", &x);
  56.     if(x == -1) root = i;
  57.     else g[--x].pb(i);
  58.    }
  59.    DFS(root);
  60.    int m;
  61.    scanf("%d", &m);
  62.    for(int i = 0, v, k; i < m; i++) {
  63.     scanf("%d%d", &v, &k);
  64.     k += h[--v];
  65.     if(k >= n) puts("0");
  66.     else printf("%d\n", upper_bound(all(level[k]), out[v]) - lower_bound(all(level[k]), in[v]));
  67.    }
  68.     return 0;
  69. }
  70.  
  71.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement