Advertisement
RaFiN_

lca + sparse table

Feb 9th, 2019
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.33 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define mx 200005
  6. //#define int long long
  7. #define pii pair <int, int>
  8. #define piii pair <int, pii>
  9. #define fi first
  10. #define se second
  11. #define mod 1000000007
  12. #define inf 1e18+19
  13. #define pb push_back
  14. #define si(x) scanf("%lld", &x)
  15. #define mem(ara, x) memset(ara, x, sizeof ara)
  16. #define read() freopen("in.txt", "r", stdin)
  17. #define write() freopen("out.txt", "w", stdout)
  18. #define fst ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  19.  
  20. vector <int> g[mx];
  21. int T[mx], P[mx][22], L[mx];
  22.  
  23. void dfs(int from,int u,int dep){
  24.     T[u]=from;
  25.     L[u]=dep;
  26.     for(int i=0;i<(int)g[u].size();i++){
  27.         int v = g[u][i];
  28.         if(v==from) continue;
  29.         dfs(u,v,dep+1);
  30.     }
  31. }
  32.  
  33. int lca_query(int N, int p, int q){
  34.     if (L[p] < L[q]) swap(p, q);
  35.     int log = 1;
  36.     while(1){
  37.         int next=log+1;
  38.         if((1<<next)>L[p])break;
  39.         log++;
  40.     }
  41.     for(int i=log;i>=0;i--){
  42.         if (L[p] - (1 << i) >= L[q]){
  43.             p = P[p][i];
  44.         }
  45.     }
  46.  
  47.     if (p == q)
  48.         return p;
  49.  
  50.     for(int i = log; i >= 0; i--){
  51.         if(P[p][i] != -1 && P[p][i] != P[q][i]){
  52.             p = P[p][i], q = P[q][i];
  53.         }
  54.     }
  55.     return T[p];
  56. }
  57.  
  58.  
  59. void lca_init(int N){
  60.     memset (P,-1,sizeof(P));
  61.     dfs(-1, 0, 0);
  62.     for(int i = 0; i < N; i++){
  63.         P[i][0] = T[i];
  64.     }
  65.     for(int j=1;1<<j<N;j++){
  66.         for(int i=0;i<N;i++){
  67.             if(P[i][j-1]!=-1){
  68.                 P[i][j] = P[P[i][j-1]][j-1];
  69.             }
  70.         }
  71.     }
  72.  }
  73.  
  74.  int dis(int a, int b, int n){
  75.     int c = lca_query(n, a, b);
  76.     return L[a] + L[b] - 2*L[c];
  77.  }
  78.  
  79. bool check(int dispath, int k){
  80.     if(dispath <= k && dispath %2 == k%2) return true;
  81.     return false;
  82.  }
  83.  
  84. int32_t main(){
  85.     //read();
  86.     fst;
  87.     int n, q;
  88.     while(cin >> n){
  89.         for(int i=0;i<n-1;i++){
  90.             int u, v;
  91.             cin >> u >> v;
  92.             u--; v--;
  93.             g[u].push_back(v);
  94.             g[v].push_back(u);
  95.         }
  96.         lca_init(n);
  97.         cin >> q;
  98.         while(q--){
  99.             int x, y, a, b, k;
  100.             cin >> x >> y >> a >> b >> k;
  101.             x--; y--; a--; b--;
  102.             if(check(dis(a, b, n), k)
  103.                ||check(dis(x, a, n) + dis(y, b, n) + 1, k)
  104.                ||check(dis(x, b, n) + dis(y, a, n) + 1, k))
  105.                 cout << "YES\n";
  106.             else cout << "NO\n";
  107.         }
  108.     }
  109.     return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement