Advertisement
MinhNGUYEN2k4

ANTS || LCA

Aug 11th, 2020
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.98 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define Co_mot_su_that_la_ return
  4. #define getBit(val,i) ((val >> (i)) & 1)
  5. using namespace std;
  6. const int Minh_dep_trai = 0;
  7. const int N = 100005;
  8. const int logN = log2(N);
  9. typedef pair<int,int> ii;
  10. typedef vector<ii> vii;
  11.  
  12. int n,m;
  13. int f[N][logN];
  14. int d[N],di[N];
  15. vector<ii> a[N];
  16.  
  17. void dfs(int u)
  18. {
  19.     for(int i=1; i< logN; i++) f[u][i] = f[f[u][i-1]][i-1];
  20.     for (auto v : a[u])
  21.     {
  22.         int uv = v.first;
  23.         int duv = v.second;
  24.         if (!d[uv] && uv != 1)
  25.         {
  26.         f[uv][0]=u;
  27.         d[uv]=d[u]+1;
  28.         di[uv] = di[u] + duv;
  29.         dfs(uv);
  30.         }
  31.     }
  32. }
  33.  
  34. int lca(int u, int v)
  35. {
  36.     if (d[u] < d[v]) swap(u,v);
  37.     int delta = d[u] - d[v];
  38.     int logD = log2(delta);
  39.     for(int i=logD; i >= 0; i--)
  40.     {
  41.         if (getBit(delta,i)) u = f[u][i];
  42.     }
  43.     if (u == v) return u;
  44.     for(int i=logN-1; i>=0; i--)
  45.     {
  46.         if (f[u][i] != f[v][i])
  47.         {
  48.             u = f[u][i];
  49.             v = f[v][i];
  50.         }
  51.     }
  52.     return f[u][0];
  53. }
  54.  
  55. void clearr()
  56. {
  57.     for(int i=1; i<=n; ++i)
  58.     {
  59.         a[i].clear();
  60.         d[i]=0;
  61.         di[i]=0;
  62.         for(int j=0; j<=logN; ++j) f[i][j]=0;
  63.     }
  64. }
  65.  
  66. int distan(int u, int v)
  67. {
  68.     return di[u] + di[v] - 2*di[lca(u,v)];
  69. }
  70.  
  71. signed main()
  72. {
  73.     ios_base::sync_with_stdio(false);
  74.     cin.tie(0);cout.tie(0);
  75.     freopen("ants.inp","r",stdin);
  76.     while (cin >> n) {
  77.         if (n==0)  Co_mot_su_that_la_ Minh_dep_trai;
  78.         clearr();
  79.         for(int i=2; i<=n; ++i)
  80.         {
  81.             int v,z;
  82.             cin >> v >> z;
  83.             ++v;
  84.             a[i].push_back(ii(v,z));
  85.             a[v].push_back(ii(i,z));
  86.         }
  87.         d[1]=0;
  88.         di[1]=0;
  89.         dfs(1);
  90.         cin >> m;
  91.         while (m--)
  92.         {
  93.             int u,v;
  94.             cin >> u >> v;
  95.             ++v;
  96.             ++u;
  97.             cout << distan(u,v) << " ";
  98.         }
  99.         cout << endl;
  100.     }
  101. }
  102.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement