Advertisement
Ritam_C

Sloth Naptime

Jan 6th, 2022
756
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. typedef long long ll;
  3. typedef unsigned long long ull;
  4. #define pb push_back
  5. #define vll vector<ll>
  6. #define vi vector<int>
  7. #define tests int t; cin >> t; while(t--)
  8. using namespace std;
  9.  
  10. int n; ll timer = 0;
  11. vector<vi> parents, tree;
  12. vi vis, powers(20); vll tin, tout;
  13.  
  14. void markParents(int u = 1) {
  15.     vis[u] = 1;
  16.     tin[u] = timer++;
  17.     for(int v : tree[u]) {
  18.         if(!vis[v]) {
  19.             parents[v][0] = u;
  20.             markParents(v);
  21.         }
  22.     }
  23.     tout[u] = timer++;
  24. }
  25.  
  26. void addEdge(int u, int v) {
  27.     tree[u].pb(v);
  28.     tree[v].pb(u);
  29. }
  30.  
  31. bool isAncestor(int u, int v) {
  32.     if(u == v) return true;
  33.     return (tin[u] <= tin[v] && tout[u] >= tout[v]);
  34. }
  35.  
  36. int parentAfterJump(int u, int j) {
  37.     int bit = 0;
  38.     while(j > 0) {
  39.         if(u == -1) break;
  40.         if(j%2) u = parents[u][bit];
  41.         bit++; j /= 2;
  42.     }
  43.     return u;
  44. }
  45.  
  46. int minJumps(int u, int v) {
  47.     int k = 19, jump = 0;
  48.     while(k >= 0) {
  49.         int p = parents[v][k];
  50.         if(!isAncestor(p, u) && p != -1) {
  51.             v = p;
  52.             jump += powers[k];
  53.         }
  54.         k--;
  55.     }
  56.     return jump+1;
  57. }
  58.  
  59. int main() {
  60.     ios_base::sync_with_stdio(false);
  61.     cin.tie(NULL); cout.tie(NULL);
  62.     cin >> n;
  63.     tree.assign(n+1, vi());
  64.     parents.assign(n+1, vi(20, -1));
  65.     vis.assign(n+1, 0);
  66.     tin.assign(n+1, 0);
  67.     tout.assign(n+1, 0);
  68.     powers[0] = 1;
  69.     for(int i = 1; i < 20; i++) powers[i] = 2*powers[i-1];
  70.     for(int i = 1; i < n; i++) {
  71.         int u, v; cin >> u >> v;
  72.         addEdge(u, v);
  73.     }
  74.     markParents();
  75.     for(int i = 1; i < 20; i++) {
  76.         for(int j = n; j >= 1; j--) {
  77.             if(parents[j][i-1] == -1) continue;
  78.             parents[j][i] = parents[parents[j][i-1]][i-1];
  79.         }
  80.     }
  81.     tests {
  82.         int a, b; ll c; cin >> a >> b >> c;
  83.         if(isAncestor(b, a)) {
  84.             int jumps = minJumps(b, a);
  85.             if(c >= jumps) {
  86.                 cout << b << "\n";
  87.             } else {
  88.                 cout << parentAfterJump(a, c) << "\n";
  89.             }
  90.         } else if(isAncestor(a, b)) {
  91.             int jumps = minJumps(a, b);
  92.             if(c >= jumps) {
  93.                 cout << b << "\n";
  94.             } else {
  95.                 cout << parentAfterJump(b, jumps-c) << "\n";
  96.             }
  97.         } else {
  98.             int jumps1 = minJumps(b, a), jumps2 = minJumps(a, b);
  99.             if(jumps1 > c) {
  100.                 cout << parentAfterJump(a, c) << "\n";
  101.             } else if(jumps1+jumps2 > c) {
  102.                 cout << parentAfterJump(b, jumps1+jumps2-c) << "\n";
  103.             } else {
  104.                 cout << b << "\n";
  105.             }
  106.         }
  107.     }
  108.     return 0;
  109. }
  110.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement