Advertisement
Josif_tepe

Untitled

Jul 8th, 2023
905
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.19 KB | None | 0 0
  1. class TreeAncestor {
  2. public:
  3.     int power_of_two;
  4.   vector<vector<int>> upper_node;
  5.   vector<int> depth_of_node;
  6.     TreeAncestor(int n, vector<int>& parent) {
  7.         power_of_two = 0;
  8.         while((1 << power_of_two) <= n) {
  9.             power_of_two++;
  10.         }
  11.         depth_of_node.resize(n + 1, 0);
  12.         upper_node.resize(n);
  13.         for(int i = 0; i < n; i++) {
  14.             upper_node[i].resize(power_of_two + 1, 0);
  15.         }
  16.      
  17.         parent[0] = 0;
  18.         for(int i = 0; i < n; i++) {
  19.             upper_node[i][0] = parent[i];
  20.             if(i != 0) {
  21.                 depth_of_node[i] = depth_of_node[parent[i]] + 1;
  22.             }
  23.            
  24.             for(int j = 1; j < power_of_two; j++) {
  25.                 upper_node[i][j] = upper_node[ upper_node[i][j - 1] ][j - 1];
  26.             }
  27.            
  28.         }
  29.        
  30.     }
  31.    
  32.     int getKthAncestor(int node, int k) {
  33.         if(depth_of_node[node] < k) {
  34.             return -1;
  35.         }
  36.         int result = node;
  37.         for(int i = 0; i < power_of_two; i++) {
  38.             if(k & (1 << i)) {
  39.                 result = upper_node[result][i];
  40.             }
  41.         }
  42.         return result;
  43.     }
  44. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement