Advertisement
Josif_tepe

Untitled

Nov 15th, 2023
760
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.55 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. const int maxn = 1e5 + 10;;
  5. typedef long long ll;
  6. int n;
  7. int up_node[maxn][22];
  8. vector<int> graph[maxn];
  9. int c_time = 0;
  10. int disc_time[maxn], finish_time[maxn];
  11. int depth[maxn];
  12. void dfs(int node, int parent) {
  13.     c_time++;
  14.     disc_time[node] = c_time;
  15.     for(int neighbour : graph[node]) {
  16.         if(neighbour != parent) {
  17.             depth[neighbour] = depth[node] + 1;
  18.             dfs(neighbour, node);
  19.         }
  20.     }
  21.     finish_time[node] = c_time;
  22. }
  23. vector<pair<int, int> > v[maxn];
  24. int lift_node(int node, int k) {
  25.     for(int i = 0; i < 20; i++) {
  26.         if(k & (1 << i)) {
  27.             node = up_node[node][i];
  28.         }
  29.     }
  30.     return node;
  31. }
  32. int main(){
  33.     ios_base::sync_with_stdio(false);
  34.     cin >> n;
  35.     int root = -1;
  36.     for(int i = 1; i <= n; i++) {
  37.         cin >> up_node[i][0];
  38.         if(up_node[i][0] == 0) {
  39.             root = i;
  40.             up_node[i][0] = -1;
  41.         }
  42.         else {
  43.             graph[i].push_back(up_node[i][0]);
  44.             graph[up_node[i][0]].push_back(i);
  45.         }
  46.     }
  47.    
  48.     for(int j = 1; j < 20; j++) {
  49.         for(int i = 1; i <= n; i++) {
  50.             if(up_node[i][j - 1] != -1) {
  51.                 up_node[i][j] = up_node[up_node[i][j - 1]][j - 1];
  52.             }
  53.         }
  54.     }
  55.     for(int i = 1; i <= n; i++) {
  56.         if(up_node[i][0] == -1) {
  57.             dfs(i, -1);
  58.         }
  59.     }
  60.     for(int i = 1; i <= n; i++) {
  61.         v[depth[i]].push_back(make_pair(disc_time[i], finish_time[i]));
  62.     }
  63.     for(int i = 1; i <= n; i++) {
  64.         sort(v[i].begin(), v[i].end());
  65.     }
  66.     int q;
  67.     cin >> q;
  68.     while(q--) {
  69.         int node, p;
  70.         cin >> node >> p;
  71.         if(depth[node] < p) {
  72.             cout << 0 << " ";
  73.             continue;
  74.         }
  75.         int ancestor = lift_node(node, p);
  76.         int L = -1;
  77.         int R = v[depth[node]].size();
  78.         while(abs(R - L) > 1) {
  79.             int mid = (L + R) / 2;
  80.             if(v[depth[node]][mid].first < disc_time[ancestor]) {
  81.                 L = mid;
  82.             }
  83.             else {
  84.                 R = mid;
  85.             }
  86.         }
  87.         int idx1 = R;
  88.         L = -1;
  89.         R = (int) v[depth[node]].size();
  90.         while(abs(R - L) > 1) {
  91.             int mid = (L + R) / 2;
  92.             if(v[depth[node]][mid].first <= finish_time[ancestor]) {
  93.                 L = mid;
  94.             }
  95.             else {
  96.                 R = mid;
  97.             }
  98.         }
  99.         cout << L - idx1  << " ";
  100.     }
  101.     return 0;
  102. }
  103.  
  104.  
  105.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement