Advertisement
Josif_tepe

Untitled

Jul 15th, 2023
865
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.57 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <vector>
  5. using namespace std;
  6.  
  7. const int maxn = 3e5 + 10;
  8. int n, LOG;
  9. int id_node[maxn];
  10. int parent[maxn];
  11. int depth[maxn];
  12. int query[maxn];
  13. struct node {
  14.     int idx, A, B;
  15.     node () {}
  16.     node(int _idx, int _A, int _B) {
  17.         idx = _idx;
  18.         A =_A;
  19.         B = _B;
  20.     }
  21. };
  22. int up_node[maxn][21];
  23. void up_node_process() {
  24.     memset(up_node, -1, sizeof up_node);
  25.     for(int i = 0; i <= n; i++) {
  26.         up_node[i][0] = parent[i];
  27.     }
  28.     for(int i = 0; i <= n; i++) {
  29.         for(int j = 1; j < LOG; j++) {
  30.             up_node[i][j] = up_node[ up_node[i][j - 1] ][j - 1];
  31.         }
  32.     }
  33. }
  34. int LCA(int A, int B) {
  35.     if(depth[A] < depth[B]) {
  36.         swap(A, B);
  37.     }
  38.     for(int i = LOG - 1; i >= 0; i--) {
  39.         if(depth[A] - (1 << i) >= depth[B]) {
  40.             A = up_node[A][i];
  41.         }
  42.     }
  43.     if(A == B) {
  44.         return A;
  45.     }
  46.     for(int i = LOG - 1; i >= 0; i--) {
  47.         if(up_node[A][i] != -1 and up_node[A][i] != up_node[B][i]) {
  48.             A = up_node[A][i];
  49.             B = up_node[B][i];
  50.         }
  51.     }
  52.     return up_node[A][0];
  53. }
  54. int main() {
  55.     ios_base::sync_with_stdio(false);
  56.    
  57.     cin >> n;
  58.     LOG = 0;
  59.     while((1 << LOG) <= n) {
  60.         LOG++;
  61.     }
  62.     memset(id_node, 0, sizeof id_node);
  63.     memset(parent, -1, sizeof parent);
  64.     memset(depth, 0, sizeof depth);
  65.     memset(query, -1, sizeof query);
  66.     parent[0] = 0;
  67.     depth[0] = 0;
  68.    
  69.    
  70.     vector<node> to_LCA;
  71.     for(int i = 1; i <= n; i++) {
  72.         char c;
  73.         cin >> c;
  74.        
  75.         if(c == 'a') {
  76.             int A;
  77.             cin >> A;
  78.            
  79.             A = id_node[A];
  80.             id_node[i] = i;
  81.             parent[i] = A;
  82.             depth[i] = depth[parent[i]] + 1;
  83.         }
  84.         else if(c == 'b') {
  85.             int A;
  86.             cin >> A;
  87.             A = id_node[A];
  88.             id_node[i] = parent[A];
  89.             query[i] = A;
  90.         }
  91.         else {
  92.             int A, B;
  93.             cin >> A >> B;
  94.             A = id_node[A];
  95.             B = id_node[B];
  96.             id_node[i] = A;
  97.             to_LCA.push_back(node(i, A, B));
  98.         }
  99.     }
  100.     up_node_process();
  101.     for(int i = 0; i < (int) to_LCA.size(); i++) {
  102.         int A = to_LCA[i].A;
  103.         int B = to_LCA[i].B;
  104.         int lca = LCA(A, B);
  105.         query[to_LCA[i].idx] = depth[lca];
  106.     }
  107.     for(int i = 1; i <= n; i++) {
  108.         if(query[i] != -1) {
  109.             cout << query[i] << endl;
  110.         }
  111.     }
  112.  
  113.     return 0;
  114. }
  115.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement