hpnq

lca+kth

Dec 14th, 2022
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.35 KB | None | 0 0
  1. #include "bits/stdc++.h"
  2.  
  3. //speed coding
  4.  
  5. #define mp make_pair
  6. #define cve(a) for (auto i : a) {cout << i << " ";  } cout << "\n";
  7. #define f first
  8. #define s second
  9. #define loop(x, n) for (int i = x; i < n; i++)
  10. #define joop(x, n) for (ll j = x; j < n; j++)
  11. #define err cout << "ERROR" << endl;
  12. #define all(x) x.begin(), x.end()
  13. #define pb push_back
  14. #define sz(x) x.size()
  15.  
  16. // types
  17. #define pii pair<int, int>
  18. #define pll pair<ll, ll>
  19. #define vvi vector<vector<int>>
  20. #define vvll vector<vector<ll>>
  21. typedef long long ll;
  22.  
  23. // types of data
  24. #define inf 1000000000
  25. #define infll 1000000000000000000
  26. #define mod 1000000009
  27.  
  28. #define DEBUG 1
  29. using namespace std;
  30.  
  31. const int logn = 20, maxn = 1e5 * 2 +10;
  32.  
  33.  
  34. vector<vector<int>> g;
  35. int par[maxn][logn] = {-1};
  36. vector<int> used, tin, tout;
  37. int t = 0;
  38. void dfs1(int v, int p = -1){
  39. //    par[v][0] = p;
  40.     used[v] = 1;
  41.     tin[v] = t++;
  42.     loop(1, logn){
  43.         // par[v][i] = par[par[v][i-1]][i-1]
  44.         par[v][i] = par[par[v][i-1]][i-1];
  45.         int t = par[v][i-1];
  46.         if(t == -1) par[v][i] = par[par[v][i-1]][i-1];
  47.         else par[v][i] = -1;
  48.  
  49.     }
  50.     for(auto to : g[v] ){
  51.         if(used[to] == 0 ){
  52.             par[to][v] = v;
  53.             dfs1(to);
  54.         }
  55.     }
  56.     tout[v] = t;
  57.  
  58. }
  59.  
  60. void dfs(int v){
  61.     used[v] = 1;
  62.     loop(1, logn){
  63.         int t = par[v][i-1];
  64.         if(t != -1 ) par[v][i] = par[t][i-1];
  65.         else par[v][i] = -1;
  66.     }
  67.     for(auto to : g[v] ){
  68.         if(used[to] == 0 ){
  69.             par[to][0] = v;
  70.             dfs(to);
  71.         }
  72.     }
  73. }
  74.  
  75. bool ch(int v, int a){
  76.     return tin[v] < tin[a] && tout[v] >= tout[a];
  77. }
  78.  
  79. int kth(int u, int k){
  80.  
  81.     loop(0, logn){
  82.         cout << u << " ";
  83.         if(u == -1) break;
  84.         if(k%2 == 1){
  85. //            err
  86.             cout << endl << u << " " << k << " " << i << endl;
  87.  
  88.             u = par[u][i];
  89. //            cout << endl << u << " " << k << endl;
  90.  
  91.         }
  92.         k/=2;
  93.     }
  94.     cout << endl;
  95.     return  u;
  96. }
  97.  
  98. //int lca(int a, int b){
  99. //    if(ch(a, b)) return a;
  100. //    if(ch(b, a)) return b;
  101. //    for(int i = logn-1; i >= 0; i--){
  102. //        if(!ch(par[a][i], b)){
  103. //            a = par[a][i];
  104. //        }
  105. //    }
  106. //    return par[a][0];
  107. //}
  108.  
  109. bool is_anc(int p, int v){
  110.     return tin[p] <= tin[v] && tout[v] >= tout[p];
  111. }
  112.  
  113. //int lca(int a, int b){
  114. //    if(is_anc(b, a)) return b;
  115. //    if(is_anc(a, b)) return a;
  116. //    for(int i = logn-1; i >=  1; i++){
  117. //        int t = par[i][a];
  118. //        if( t!= -1 && !is_anc(t, b)) a = t;
  119. //    }
  120. //    return  par[0][a];
  121. //}
  122.  
  123. void solve(){
  124.     int n;
  125.     cin >> n;
  126.     used.resize(n, 0);
  127.     g.resize(n);
  128.     tin.resize(n);
  129.     tout.resize(n);
  130. //    par.resize(T, vector<int> (n, -1));
  131.     loop(0, n-1){
  132.         int a, b;
  133.         cin >> a >> b;
  134.         a--, b--;
  135.         g[a].pb(b);
  136.         g[b].pb(a);
  137.     }
  138.     dfs(0);
  139.     int m;
  140.     cin >> m;
  141.     loop(0, m){
  142.         int u, k;
  143.         cin >> u >> k;
  144.         u--;
  145. //        int kkt = kth(u, k);
  146.         int ans = kth(u, k) == -1 ? -1 : kth(u, k);
  147. //        cout << ans  <<"\n";
  148.     }
  149. //    for(auto i : par[7]){
  150. //        cout << i << " ";
  151. //    }
  152. //    cout << par[7][2];
  153. }
  154.  
  155. int main() {
  156.     ios::sync_with_stdio(0);
  157.     cin.tie(0);
  158. #ifdef DEBUG
  159.     freopen("text.txt", "r", stdin);
  160. #else
  161. #endif
  162.     solve();
  163.     return 0;
  164. }
  165.  
Advertisement
Add Comment
Please, Sign In to add comment